( 纯属个人胡猜乱蒙 , 切勿信以为真 )拓扑排序 , 实际上的思想 我感觉还是建树 和 吝啬的国度 的 建图过程应该是差不多的 , 然后就去 vector 建图了 , 结果一段时间 没有这样做过 现在 建好之后不能用就懵逼了 ....... 先付上简单二维数组解决 一会再去试试 vector 解决
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 using namespace std; 15 int n,m,visited[505],result[505],a[505][505]; 16 void topsort() 17 { 18 for(int i=1;i<=n;i++) 19 { 20 int j=1; 21 while(visited[j]!=0) // 找一个没爹的 22 j++; 23 result[i]=j; // 存起来 24 visited[j]--; // 干掉 他爹 25 for(int k=1;k<=n;k++) 26 { 27 if(a[j][k]) // 检查一下 他爹 都有那些孩子 将孩子的 爹爹数 -1 28 visited[k]--; 29 } 30 } 31 } 32 int main() 33 { 34 while(scanf("%d%d",&n,&m)!=EOF) 35 { 36 memset(visited,0,sizeof(visited)); 37 memset(a,0,sizeof(a)); 38 for(int i=0;i<m;i++) 39 { 40 int b,c; 41 scanf("%d%d",&b,&c); 42 if(a[b][c]==0) // 防止 出现 重边的情况 43 { 44 a[b][c]=1; // 儿子和爹 配了一套了 下次还是 儿子或者是爹的话 另一个 就不能一样了 45 visited[c]++; // 用于记录每一个点的 有几个爹 46 } 47 } 48 topsort(); 49 for(int i=1;i<n;i++) 50 printf("%d ",result[i]); 51 printf("%d\n",result[n]); 52 } 53 return 0; 54 }
用vector的话......