UVA 10305 Ordering Tasks

 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 }

猜你喜欢

转载自www.cnblogs.com/fudanxi/p/10544945.html