• HDOJ 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<bits/stdc++.h>
    #define MAX 505
    using namespace std;
    int in[MAX],n,m;
    vector<int>to[MAX];
    void topsort()
    {
        priority_queue<int,vector<int>,greater<int> >qu;
        int i,sum=0;
        for(i=1;i<=n;i++) 
            if(in[i]==0)
                qu.push(i);
    
        while(!qu.empty())
        {
            int a=qu.top();
            qu.pop();
            sum++;
            if(sum==1)cout<<a;
            else cout<<" "<<a;
            for(i=0;i<to[a].size();i++)
            {
                int v=to[a][i];
                in[v]--;
                if(in[v]==0)
                    qu.push(v);
            }
        }
        cout<<endl;
    } 
    int main()
    {
        ios::sync_with_stdio(false);
        int u,v,i;
        while(cin>>n>>m)
        {
            memset(in,0,sizeof(in));
            for(i=1;i<=m;i++)
            {
                cin>>u>>v;
                to[u].push_back(v);
                in[v]++;
            } 
            topsort();
            for(i=0;i<=MAX;i++)
                to[i].clear();    
        }
        return 0;
    } 
  • 相关阅读:
    Linux下安装配置jdk
    Linux基础实验(二)
    Linux基础命令(一)
    Linux基础实验(一)
    QT 参考资料
    C++ const_cast用法(转)
    05 内嵌汇编的编程
    构造函数和析构函数可以调用虚函数吗(转)
    C++之迭代器(Iterator)篇 (转)
    链接脚本
  • 原文地址:https://www.cnblogs.com/kannyi/p/9787430.html
Copyright © 2020-2023  润新知