码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 10305 Ordering Tasks

时间:2019-03-17 01:27:53      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:排序   ++   题意   cstring   als   for   修改   注意   max   

 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 }

 

UVA 10305 Ordering Tasks

标签:排序   ++   题意   cstring   als   for   修改   注意   max   

原文地址:https://www.cnblogs.com/fudanxi/p/10544945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!