1 // 题意:输入n和m,以及m个二元组(i,j),求1~n的一个排列使得对于每个(i,j),i在j的前面
2 // 算法:拓扑排序。注意m可能等于0
3 #include<cstdio>
4 #include<cstring>
5 const int maxn = 1000;
6 int n, m, G[maxn][maxn], c[maxn], topo[maxn], t;
7 /*
8 用dfs递归到最深的一层,这层的u就是排序的最后,修改topo下标的值,
9 从后往前修改
10 */
11 bool dfs(int u)
12 {
13 c[u] = -1;//访问标志
14 for (int v = 0; v < n; v++)
15 {
16 if (G[u][v])
17 {
18 if (c[v] < 0)
19 return false;//存在有向环,失败
20 else if (!c[v])
21 {
22 dfs(v);
23 }
24 }
25 }
26 c[u] = 1;
27 topo[--t] = u;
28 return true;
29 }
30
31 bool toposort()
32 {
33 t = n;
34 memset(c, 0, sizeof(c));
35 for (int u = 0; u < n; u++)
36 {
37 if (!c[u])
38 if (!dfs(u))
39 return false;
40 }
41 return true;
42 }
43
44 int main()
45 {
46 while (scanf("%d%d",&n,&m)==2&&n)
47 {
48 memset(G, 0, sizeof(G));
49 for (int i = 0; i < m; i++)
50 {
51 int u, v;
52 scanf("%d%d", &u, &v);
53 G[u - 1][v - 1] = 1;
54
55 }
56 if (toposort())
57 {
58 for (int i = 0; i < n-1; i++)
59 printf("%d ", topo[i] + 1);
60 printf("%d\n", topo[n - 1]+1);
61 }
62 }
63 return 0;
64 }