UVa 10305 - Ordering Tasks

  有n件事事情要做,它们有m个完成先后顺序,求出一个它们完成的先后顺序,即拓扑排序。

  套用代码即可,不过开始的时候while内条件写的是 while(scanf("%d%", &n, &m) != EOF && n &&m)  结果WA了,怎么都想不明白怎么会错了,后来发现会有n!=0&&m=0的情况出现,不过这样的话它们不是相互独立了吗?当时想当然的就没考虑这种情况,以后还是老老实实地按照题目给的要求吧...

  代码如下:

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int maxn = 110;
 5 int n, m;
 6 int G[maxn][maxn], topo[maxn];
 7 int c[maxn], t;
 8 
 9 bool dfs(int u)
10 {
11     c[u] = -1;
12     for(int v = 1; v <= n; v++)
13         if(G[u][v])
14         {
15             if(c[v] < 0)   return false;
16             else if(!c[v] && !dfs(v))   return false;
17         }
18     c[u] = 1;
19     topo[--t] = u;
20     return true;
21 }
22 
23 bool toposort()
24 {
25     t = n;
26     memset(c, 0, sizeof(c));
27     for(int u = 1; u <= n; u++)
28         if(!c[u])
29             if(!dfs(u))  return false;
30     return true;
31 }
32 
33 int main()
34 {
35 #ifdef LOCAL    
36     freopen("in", "r", stdin);
37 #endif
38     while(scanf("%d%d", &n, &m) != EOF )
39     {
40         if(!m && !n)   break;
41         int u, v;
42         memset(G, 0, sizeof(G));
43         while(m--)
44         {
45             scanf("%d%d", &u, &v);
46             G[u][v] = 1;
47         }
48         toposort();
49         for(int i = 0; i < n; i++)
50         {
51             printf("%s", i ? " " : "");
52             printf("%d", topo[i]);
53         }
54         printf("\n");
55     }
56     return 0;
57 }

 

转载于:https://www.cnblogs.com/xiaobaibuhei/archive/2013/04/27/3047565.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值