最简单的拓扑排序

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

 

原文地址:https://www.cnblogs.com/A-FM/p/5363688.html