• 确定比赛名次


    确定比赛名次

    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

    思路:

    简单的拓扑排序,这里需要注意的是要求输出时编号小的队伍在前,所以我们在添加入度为0的节点时,可以考虑使用优先队列。

    拓扑排序过程:

    1)统计入度为0 的节点将其加入队列。

    2)遍历队列,每取出一个节点,减少与之相连的节点的入度,若其入度为0 则加入队列。

    ps:这里我写代码的时候忘了注意没边相连的时候应该直接continue,不应该执行入度-1操作,这样会重复。

    代码:

    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    bool maps[517][517];
    int in[517];
    priority_queue<int ,vector<int> ,greater<int > > que;
    
    void topsort(int n){
        //将入度为0 的节点加入队列
        for (int i = 1; i <= n; i++){
            if(in[i]==0) que.push(i);
        }
        int cnt=1;
        while (!que.empty()){
            int u =que.top();
            que.pop();
            if(cnt!=n){
                cout<<u<<" ";
                cnt++;
            }
            else
                cout<<u<<endl;
            for (int i = 1; i <=n; i++){
                if(!maps[u][i]) continue;
                in[i]--;
                if(in[i]==0) que.push(i);
            }
        }
    }
    int main(){
        int n,m;
        while(cin>>n>>m){
            int x,y;
            memset(maps,0,sizeof(maps));
            memset(in,0,sizeof(in));
            while (m--){
                cin>>x>>y;
                if(maps[x][y]) continue;//会有重复的数据
                maps[x][y]=1;
                in[y]++;
            }
            topsort(n);
        }
    
    }
    View Code

     

     

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/14303830.html

  • 相关阅读:
    C- c常见问题分析
    LEETCODE
    MPI之求和
    在VS2010配置MPI--win7下64位系统
    OpenMP之枚举排序
    OpenMP之数值积分(求圆周率Pi)(sections)
    OpenMP之求和(用section分块完成)
    64位WIN7下安装MPICH2
    Ubuntu下eclipse开发hadoop应用程序环境配置
    C语言字符串函数例子程序大全 – string相关
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/14303830.html
Copyright © 2020-2023  润新知