HDU 1285 确定比赛名次【拓扑排序】

来源:互联网 发布:淘宝培训kehuda 编辑:程序博客网 时间:2024/05/18 02:51

确定比赛名次

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 50   Accepted Submission(s) : 37

Font: Times New Roman | Verdana | Georgia

Font Size:  

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 31 22 34 3

Sample Output

1 2 4 3

Author

SmallBeer(CML)

Source

杭电ACM集训队训练赛(VII)

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<climits>#include<string>#include<queue>#include<stack>#include<algorithm>using namespace std;#define rep(i,j,k)for(i=j;i<k;i++)#define per(i,j,k)for(i=j;i>k;i--)#define MS(x,y)memset(x,y,sizeof(x))typedef long long LL;const int INF =0x7FFFFFFF;const int low(int x){return x&-x;}const int M=505;int mp[M][M];int dis[M];int flag[M];int i,j,n,m,k;void Topo(){    rep(i,1,n+1)        rep(j,1,n+1)            if(!dis[j]){                dis[j]--;                flag[i]=j;                rep(k,1,n+1)                 if(mp[j][k])dis[k]--;                break;            }}int main(){    while(cin>>n>>m)    {        MS(mp,0);        MS(dis,0);        MS(flag,0);        rep(i,0,m)        {            int a,b;            cin>>a>>b;            if(!mp[a][b])            {                mp[a][b]=1;                dis[b]++;            }        }        Topo();        cout<<flag[1];        rep(i,2,n+1)          cout<<' '<<flag[i];        cout<<endl;    }    return 0;}


0 0