HDU1285确定比赛名次

确定比赛名次                                Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
                                                    Total Submission(s): 23876    Accepted Submission(s): 9630


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
 
 
 1 #include<stdio.h>
 2 #include<memory.h>
 3 
 4 int map[507][507];
 5 int in[507];
 6 int topsort[507];
 7 
 8 int n,m,i,j;
 9 
10 void tsort()
11 {
12     for(i=1;i<=n;i++)
13         {
14             int k =1;
15             while(in[k]!=0) k++;
16             in[k] = -1;
17 
18             topsort[i] = k;
19             for(j=1;j<=n;j++)
20             {
21                 if(map[k][j]==1){
22                     in[j]--;
23                 }
24             }
25         }
26 }
27 int main(){
28     while(scanf("%d%d",&n,&m)!=EOF)
29     {
30         int a,b;
31         memset(map,0,sizeof(map));
32         memset(in,0,sizeof(in));
33         memset(topsort,0,sizeof(topsort));
34         for(i=0;i<m;i++)
35         {
36             scanf("%d%d",&a,&b);
37             if(map[a][b] == 0)
38             {
39                 map[a][b] = 1;
40                 in[b]++;
41             }
42         }
43         tsort();
44         for(i=1;i<n;i++)
45             printf("%d ",topsort[i]);
46         printf("%d
",topsort[i]);
47     }
48 }
 
 



原文地址:https://www.cnblogs.com/liwenchi/p/7259340.html