UVa 10305 (拓扑排序) Ordering Tasks

题意:

经典的拓扑排序。有n个任务,然后某些任务必须安排在某些任务前面完成,输出一种满足要求的序列。

分析:

拓扑排序用离散里面的话来说就是将偏序关系拓展为全序关系。我们将“小于”这种关系看做一条有向边,如果得到的图是有向无环图DAG(Directed Acyclic Graph),则是存在拓扑排序的,如果存在有向环,则不存在拓扑排序。

 

注意输入数据里面m可能等于0的情况,就因为这个WA了两次。

 

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 105;
 8 int G[maxn][maxn], c[maxn];
 9 int topo[maxn], t;
10 int n, m;
11 
12 bool dfs(int  u)
13 {
14     c[u] = -1;
15     for(int v = 1; v <= n; ++v) if(G[u][v])
16     {
17         if(c[v] < 0)    return false; //´æÔÚ»·
18         else if(!c[v] && !dfs(v))    return false;
19     }
20     c[u] = 1; topo[--t] = u;
21     return true;
22 } 
23 
24 bool toposort()
25 {
26     t = n;
27     memset(c, 0, sizeof(c));
28     for(int u = 1; u <= n; ++u)    if(!c[u])
29         if(!dfs(u))    return false;
30     return true;
31 }
32 
33 int main(void)
34 {
35     #ifdef LOCAL
36         freopen("10305in.txt", "r", stdin);
37     #endif
38 
39     while(scanf("%d%d", &n, &m) == 2 && n)
40     {
41         memset(G, 0, sizeof(G));
42         int a, b;
43         for(int i = 0; i < m; ++i)
44         {
45             scanf("%d%d", &a, &b);
46             G[a][b] = 1;
47         }
48         toposort();
49         for(int i = 0; i < n-1; ++i)
50             printf("%d ", topo[i]);
51         printf("%d\n", topo[n-1]);
52     }
53 
54     return 0;
55 }
代码君

 

posted @ 2014-09-24 17:14  AOQNRMGYXLMV  阅读(299)  评论(0编辑  收藏  举报