• acm专题---拓扑排序+优先队列


    struct node
    {
    int id;
    int cnt;
    node(int _id,int _cnt):id(_id),cnt(_cnt){}
    bool operator<(node a) const{return cnt<a.cnt;}
    bool operator>(node a) const{return cnt>a.cnt;}
    };

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1285

    Problem Description
    有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
     
    Input
    输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
     
    Output
    给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

    其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
     
    Sample Input
    4 3 1 2 2 3 4 3
     
    Sample Output
    1 2 4 3
    #include <iostream>
    #include <string>
    #include <string.h>
    #include <vector>
    #include <queue>
    #include <algorithm>
    #include <sstream>
    #include<queue>
    #include<cstdio>
    #include<cstring>

    using namespace std;
    const int maxnum=501;
    bool graph[maxnum][maxnum];
    int indegree[maxnum];
    struct cmp
    {
    bool operator()(int x,int y)
    {
    return x>y;
    }
    };
    void top_sort(int n)
    {
    vector<int> ans;
    priority_queue<int,vector<int>,greater<int> > myque;
    for(int j=1;j<=n;j++)
    {
    if(indegree[j]==0) {
    myque.push(j);
    }
    }
    for(int i=1;i<=n;i++)
    {


    int toptmp=myque.top();
    ans.push_back(toptmp);
    myque.pop();
    for(int j=1;j<=n;j++)
    {
    if(graph[toptmp][j])
    {
    indegree[j]--;
    if(indegree[j]==0)
    myque.push(j);
    }
    }
    }
    for(int i=0;i<ans.size()-1;i++)
    cout<<ans[i]<<" ";
    cout<<ans[ans.size()-1]<<endl;

    }

    int main()
    {
    int n=0,m=0;
    while(cin>>n>>m) {
    memset(indegree, 0, sizeof(indegree));
    memset(graph, false, sizeof(graph));
    for (int i = 0; i < m; i++) {
    int p1, p2;
    cin >> p1 >> p2;
    if (!graph[p1][p2])
    indegree[p2]++;
    graph[p1][p2] = true;

    }
    top_sort(n);
    }

    }
    /*

    4 3
    1 2
    2 3
    2 4

    */

      

  • 相关阅读:
    C# Assembly 反射
    C# Assembly 反射
    为C#自定义控件添加自定义事件
    为C#自定义控件添加自定义事件
    redis5.0的槽点迁移,随意玩(单机迁移集群)
    redis5.0的槽点迁移,随意玩(单机迁移集群)
    []MongoDB优化的几点原则
    []MongoDB优化的几点原则
    当MongoDB遇见Spark
    当MongoDB遇见Spark
  • 原文地址:https://www.cnblogs.com/wuxiangli/p/6397250.html
Copyright © 2020-2023  润新知