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