• HDU 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

    思路

    拓扑序的模板题,虽然我这份代码在oj上过不了,可能因为hdu评测机的问题吧,我回去再研究研究。

    代码实现

    
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<iostream>
    using namespace std;
    const int maxn = 10005;
    int in_degree[maxn], n ,m;
    int u, v;
    vector <int> to[maxn];
    void toposort () {
       priority_queue<int,vector<int>,greater<int> > q;
       int sum=0;
       for (int i=1;i<=n;i++) {
           if (!in_degree[i]) q.push(i);
       }
       while (!q.empty()) {
           int u=q.top();
           q.pop();
           in_degree[u]=-1;
           cout<<u;
           sum++;
           if (sum==n) cout<<endl;
           else cout<<" ";
           for (int i=0;i<to[u].size();i++) {
               in_degree[to[u][i]]--;
               if (!in_degree[to[u][i]]) q.push(to[u][i]);
           }    
       }
    }
    int main () {
        while (cin>>n>>m) {
            memset (in_degree,0,sizeof (in_degree));
            for (int i=1;i<=n;i++) {
                to[i].clear();
            }
            for (int i=1;i<=m;i++) {
                cin>>u>>v;
                to[u].push_back(v);
                in_degree[v]++;
            }
            toposort ();
        }
        return 0;
    }
    
  • 相关阅读:
    [Swift]LeetCode156.二叉树的上下颠倒 $ Binary Tree Upside Down
    [Swift]LeetCode155. 最小栈 | Min Stack
    [Swift]LeetCode154. 寻找旋转排序数组中的最小值 II | Find Minimum in Rotated Sorted Array II
    CXF生成client注意事项
    使用oracle10g官方文档找到监听文件(listener.ora)的模板
    在Vi里面实现字符串的批量替换
    C语言之基本算法12—谁是冠军
    虚拟机 minimal 安装增强包
    ZOJ
    leetcode Reverse Nodes in k-Group
  • 原文地址:https://www.cnblogs.com/hhlya/p/13121787.html
Copyright © 2020-2023  润新知