http://poj.org/problem?id=2367
题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0。
这是一个特别裸的拓扑排序的一个题目,拓扑排序我也是刚刚才接触,想法还是挺简单的。实现起来也不复杂。
1 #include <stdio.h> 2 #include <string.h> 3 4 int Indegree[101],n; 5 6 bool mp[101][101]; 7 8 int topsort() 9 { 10 for(int i=1;i<=n;i++) 11 for(int j=1;j<=n;j++) //遍历n次,找到第一个度为0的点,度为0的点,即排在这个点前面的点要么是没有,要么是已经输出了。 12 { 13 if(Indegree[j]==0) 14 { 15 Indegree[j]--; 16 printf("%d",j); 17 if(i!=n) printf(" "); 18 else printf("\n"); 19 for(int k=1;k<=n;k++) //排在这个度为0后面的点,度都可以相应的减一,因为在它们的前面的点已经少了一个。 20 { 21 if(mp[j][k]) Indegree[k]--; 22 } 23 break; 24 } 25 26 } 27 return 0; 28 } 29 30 31 32 int main() 33 { 34 // freopen("in.txt","r",stdin); 35 int x; 36 scanf("%d",&n); 37 memset(mp,false,sizeof(mp)); 38 for(int i=1;i<=n;i++) 39 { 40 while(scanf("%d",&x),x) 41 { 42 mp[i][x]=true; 43 Indegree[x]++; 44 } 45 } 46 47 topsort(); 48 return 0; 49 }
时间: 2024-11-07 13:55:57