

1 //拓扑排序延续之拓扑排序 入度 2 3 #include <iostream> 4 5 #include <stack> 6 7 using namespace std ; 8 9 const int MAXN = 100 ; 10 11 int G[MAXN][MAXN] , ans[MAXN] ; 12 13 int n ,count ; bool TopoSort() 14 15 { 16 17 int into[MAXN] ; 18 19 memset(into,0,sizeof(into)) ; 20 21 memset(ans,0,sizeof(ans)) ; 22 23 for (int i = 0 ; i < n ; ++ i) 24 25 { 26 27 for (int j = 0 ; j < n ; ++ j) 28 29 { 30 31 if (G[i][j] > 0) 32 33 { 34 35 into[j] ++ ; 36 37 } 38 39 } 40 41 } 42 43 stack<int> s ; 44 45 for (i = 0 ; i < n ; ++ i) 46 47 { 48 49 if (!into[i]) 50 51 { 52 53 s.push(i) ; 54 55 into[i] = -1 ; 56 57 } 58 59 } 60 61 while (!s.empty()) 62 63 { 64 65 int u = s.top() ; 66 67 s.pop() ; 68 69 ans[count++] = u ; 70 71 for (int j = 0 ; j < n ; ++ j) 72 73 { 74 75 if (G[u][j]) 76 77 { 78 79 into[j] -- ; 80 81 } 82 83 if (!into[j]) 84 85 { 86 87 s.push(j) ; 88 89 into[j] = -1 ; 90 91 } 92 93 } 94 95 } 96 97 if (count != n) 98 99 { 100 101 return false ; 102 103 } 104 105 return true ; 106 107 } 108 109 int main() 110 111 { 112 113 memset(G,0,sizeof(G)) ; 114 115 int m ; 116 117 cin >> n >> m ; 118 119 for(int i = 0 ; i < m ; ++ i) 120 121 { 122 123 int u , v ; 124 125 cin >> u >> v ; 126 127 G[u][v] = 1 ; 128 129 } 130 131 if (TopoSort()) 132 133 { 134 135 for (int i = 0 ; i < n ; ++ i) 136 137 { 138 139 cout << ans[i] << " " ; 140 141 } 142 143 cout << endl ; 144 145 } 146 147 else 148 149 cout << -1 << endl ; 150 151 return 0 ; 152 153 } 154 155