确定比赛名次

http://acm.hdu.edu.cn/showproblem.php?pid=1285

View Code
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std ;
 4 #define maxn 501
 5 int map[maxn][maxn] ;
 6 int indegree[maxn], ans[maxn] ;
 7 int topological(int n)
 8 {
 9     for(int i=1; i<=n; i++)
10     {
11         int j = 1 ;
12         while(indegree[j])
13         j++ ;
14         ans[i] = j ;
15         indegree[j] = -1 ;
16         for(int k=1; k<=n; k++)
17         {
18             if(map[j][k])
19             indegree[k]-- ;
20         }
21     }
22     return 0 ;
23 }
24 int main()
25 {
26     int n, m, p1, p2 ;
27     while(cin>>n>>m)
28     {
29         memset(map, 0, sizeof(map)) ;
30         memset(indegree, 0, sizeof(indegree)) ;
31         while(m--)
32         {
33             cin>>p1>>p2 ;
34             if(!map[p1][p2])
35             indegree[p2]++ ;
36             map[p1][p2] = 1 ;
37         }
38         topological(n) ;
39         for(int i=1; i<n; i++)
40         cout<<ans[i]<<" " ;
41         cout<<ans[n]<<endl ;
42     }
43     return 0 ;
44 }

这样做比一般的做法要省时

下面是一般的做法:

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 int ans[555];
 4 int map[505][505];
 5 int indegree[505];
 6 int topological(int n)
 7 {
 8     int i,j;
 9     int k;
10     k=0;
11     while(k<n)
12     {
13         for(i=1;i<=n;i++)
14         {
15             if(indegree[i]==0)
16             {
17                 indegree[i] = - 1 ;
18                 ans[k++]=i;
19                 for(j=1;j<=n;j++)
20                 if(map[i][j])
21                 {
22                     indegree[j]--;
23                     break;
24                 }
25             }
26         }
27     }
28     return 0 ;
29 }
30 int main()
31 {
32     int n,m;
33     int i;
34     int a,b;
35     while(scanf("%d%d",&n,&m)!=EOF)
36     {
37         memset(map,0,sizeof(map));
38         memset(indegree,0,sizeof(indegree));
39         for(i=1;i<=m;i++)
40         {
41             scanf("%d%d",&a,&b);
42             if(!map[a][b])
43             {
44                 map[a][b]=1;
45                 indegree[b]++;
46             }
47         }
48         topological(n);
49         for(i=0;i<n-1;i++)  printf("%d ",ans[i]);
50         printf("%d\n",ans[i]);
51     }
52     return 0;
53 }

结果:Time Limit Exceeded

原文地址:https://www.cnblogs.com/yelan/p/2934295.html