UVa 10305 - Ordering Tasks
有n件事事情要做,它们有m个完成先后顺序,求出一个它们完成的先后顺序,即拓扑排序。
套用代码即可,不过开始的时候while内条件写的是 while(scanf("%d%", &n, &m) != EOF && n &&m) 结果WA了,怎么都想不明白怎么会错了,后来发现会有n!=0&&m=0的情况出现,不过这样的话它们不是相互独立了吗?当时想当然的就没考虑这种情况,以后还是老老实实地按照题目给的要求吧...
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }