UVA 10305 Ordering Tasks
Posted fudanxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ", topo[n - 1]+1); 61 } 62 } 63 return 0; 64 }
以上是关于UVA 10305 Ordering Tasks的主要内容,如果未能解决你的问题,请参考以下文章
Uva 10305 Ordering Tasks(拓扑排序模版题)