( 纯属个人胡猜乱蒙 , 切勿信以为真 )拓扑排序 , 实际上的思想 我感觉还是建树 和 吝啬的国度 的 建图过程应该是差不多的 , 然后就去 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
",result[n]);
52 }
53 return 0;
54 }
用vector的话......