5.2.4 确定比赛名次

确定比赛名次

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 206 Accepted Submission(s): 118

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 <cstdio>
 2 #include <cstring>   
 3 #include <iostream>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 int c,t,n,cas,x,y,m;
 9 const int maxn=510;
10 
11 bool f[maxn][maxn],flag,p[maxn];
12 int ans[maxn],cnt;
13 
14 void close()
15 {
16     exit(0);
17 }
18 
19 void work()
20 {
21 }
22 
23 void init()
24 {
25     while(scanf("%d %d",&n,&m)!=EOF)
26      {
27          cnt=0;
28          memset(f,false,sizeof(f));
29          memset(p,false,sizeof(p));
30          for (int i=1;i<=m;i++)
31          {
32              scanf("%d %d",&x,&y);
33              f[x][y]=true;
34          }
35          while (cnt!=n)
36          {
37             for (int i=1;i<=n;i++)
38              {
39                  if (p[i]) continue;
40                  flag=false;
41                   for (int j=1;j<=n;j++)
42                     if (f[j][i])
43                     {
44                         flag=true;
45                         break;
46                     }
47                 if (flag) continue;
48                 cnt++;
49                ans[cnt]=i;
50                  p[i]=true;
51                    for (int j=1;j<=n;j++)
52                        if (f[i][j])
53                            f[i][j]=false;
54                      break;
55              }
56          }
57          for (int i=1;i<=cnt;i++)
58              if (i!=1)
59                  printf(" %d",ans[i]);
60              else printf("%d",ans[i]);
61          printf("\n");
62      }
63 }
64 
65 
66 int main ()
67 {
68     init();
69     work();
70     close();
   }
原文地址:https://www.cnblogs.com/cssystem/p/2918354.html