确定比赛名次

确定比赛名次

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

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 3
1 2
2 3
4 3

Sample Output

1 2 4 3

思路:拓扑排序,是对于有向无环图而言的,或者说不是这种图不存在拓扑排序。算法:首先找入度为0的点且最小的点,输出该点,然后把与该点有关的且把该点作为入度的点的入度减少1,并且把该点和该边销毁,循环以上步骤,直到最后把所有的点找完,或者已找不到入度为0的点为止。
 1 #include<stdio.h>
 2 #include<string.h>
 3 int degree[505],vis[505],map[501][501];
 4 int main()
 5 {
 6     int n,m,a,b,i,j,min;
 7     while(~scanf("%d%d",&n,&m))
 8     {
 9         memset(degree,0,sizeof(degree));
10         memset(vis,0,sizeof(vis));
11         memset(map,0,sizeof(map));
12         while(m--)
13         {
14             scanf("%d%d",&a,&b);
15             if(!map[a][b])        //重边不计!(此题测试数据有重边);
16             {
17                 degree[b]++;
18                 map[a][b] = 1;
19             }
20         }
21         min = 501;
22         for(i = 0;i < n;i ++)
23         {
24             for(j = 1;j <= n;j ++)    //寻找入度为0且编号最小的边;
25             {
26                 if(degree[j] == 0 && j < min && vis[j] == 0)
27                     min = j;
28             }
29            vis[min] = 1;    //把该点销毁;
30            if(i != n-1)
31                 printf("%d ",min);
32            else
33                 printf("%d
",min);
34            for(j = 1;j <= n;j ++)         //  处理与该点相关的并以该点作为入度的所有点;
35            {
36                 if(j != min && vis[j] == 0)
37                 {
38                     if(map[min][j] == 1)
39                     {
40                          degree[j]--;
41                          map[min][j] = 0;    //销毁边;
42                     }
43                 }
44            }
45            min = 501;
46         }
47     }
48     return 0;
49 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3372837.html