确定比赛名次
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