UVA10305 Ordering Tasks
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA10305 Ordering Tasks相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
这是一道典型的拓扑排序题, 学长讲完拓扑序之后敲了一下, 结果wa了两发,也不知道错在了哪, 然后就给放到一边了, 今天又重新看了一遍, 在网上搜了一下大神的解题报告, 突然间看到了一句话 : 这道题有个坑 就是 n != 0 && m == 0 我一下子就发现了自己代码的问题。 果然 去掉了m == 0 的判断 A了 。
果然还是太年轻。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdlib> 5 #include<algorithm> 6 7 using namespace std; 8 9 const int MaxN = 100; 10 int pre[2 * MaxN + 5], last[MaxN + 5], other[2 * MaxN + 5]; 11 int all, n, m; 12 int seq[MaxN + 5]; 13 int ind[105]; 14 15 void Build(int u, int v) 16 { 17 pre[++all] = last[u]; 18 last[u] = all; 19 other[all] = v; 20 ind[v]++; 21 } 22 23 void topo() 24 { 25 int head = 1, tial = 0; 26 for(int i = 1; i <= n; i++) 27 if(ind[i] == 0) 28 seq[++tial] = i; 29 while(head <= tial) 30 { 31 int now = seq[head]; 32 int ed = last[now], dr; 33 while(ed != -1) 34 { 35 dr = other[ed]; 36 ind[dr]--; 37 if(ind[dr] == 0) seq[++tial] = dr; 38 ed = pre[ed]; 39 } 40 head++; 41 } 42 for(int i = 1; i <= n; i++) 43 printf("%d ", seq[i]); 44 printf("\n"); 45 } 46 int main() 47 { 48 while(~scanf("%d%d", &n, &m) && n) 49 { 50 all = -1; 51 memset(last, -1, sizeof(last)); 52 memset(ind, 0, sizeof(ind)); 53 memset(pre, 0, sizeof(pre)); 54 memset(other, 0, sizeof(other)); 55 memset(seq, 0, sizeof(seq)); 56 for(int i = 1; i <= m; i++) 57 { 58 int x, y; 59 scanf("%d%d", &x, &y); 60 Build(x, y); 61 } 62 topo(); 63 } 64 return 0; 65 }
以上是关于UVA10305 Ordering Tasks的主要内容,如果未能解决你的问题,请参考以下文章
Uva 10305 Ordering Tasks(拓扑排序模版题)