给任务排序,紫书P167Uva10305
来源:互联网 发布:分类汇总数据复制出来 编辑:程序博客网 时间:2024/06/04 23:20
通过本题第一次学到拓扑排序的概念,以及dfs解决拓扑排序的方法。
// UVa10305 Ordering Tasks// Rujia Liu#include<cstdio>#include<cstring>const int maxn = 1000;int n, m, G[maxn][maxn], c[maxn], topo[maxn], t;bool dfs(int u){ c[u] = -1; for(int v = 0; v < n; v++) if(G[u][v]) { if(c[v]<0) return false; else if(!c[v] && !dfs(v)) return false; } c[u] = 1; topo[--t]=u; return true;}bool toposort(){ t = n; memset(c, 0, sizeof(c)); for(int u = 0; u < n; u++) if(!c[u]) if(!dfs(u)) return false; return true;}int main() { while(scanf("%d%d", &n, &m) == 2 && n) { memset(G, 0, sizeof(G)); for(int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--; v--; G[u][v] = 1; } if(toposort()) { for(int i = 0; i < n-1; i++) printf("%d ", topo[i]+1); printf("%d\n", topo[n-1]+1); } else printf("No\n"); }}
其中标记数组c是本题的关键,c[u] == 0:表示节点u未排序过,c[u] == -1表示u节点正在排序中,c[u] == 1表示u节点排序完了。而本题排序失败的条件就是该有向图存在环,放到程序中就是dfs过程中会回到正在访问的变量。也就是-1。
至于核心的dfs细节还是需要反复理解。
阅读全文
0 0
- 给任务排序,紫书P167Uva10305
- UVA 10305 给任务排序
- UVa 10305 给任务排序
- uva 10305 给任务排序
- 10305UVa给任务排序
- 给任务排序(Ordering Tasks,UVa 10305)
- 例题:给任务排序(UVa 10305)
- 给任务排序(uva 10305)
- 拓扑排序(给任务排序,UVA 10305)
- Uva10305给任务排序(拓扑排序 板子题)
- 给三个整数排序(第十七周上机任务)
- 例题 6-15 UVA 10305 Ordering Tasks 给任务排序
- 例题6-15 给任务排序 UVA 10305(拓扑排序)
- 紫书章六例题15 给任务排序 UVA 10305(拓扑排序)
- 例题6-15 给任务排序(Ordering Tasks, UVa 10305)
- 做任务给分
- 给我的任务,给blog的任务。
- future给任务设置时限
- 大数据【关于ssh: connect to host master port 22: Connection timed out问题的总结】
- 一篇通俗易懂的讲解OpenGL ES的文章,opengles
- hdu 1811 Rank of Tetris 并查集+拓扑排序
- 写博客对我的意义
- 百度地图API获取发布版SHA1
- 给任务排序,紫书P167Uva10305
- 【算法】排序
- pano2vr教程
- rocketmq双Master集群模式搭建
- eclipse开发webservice服务
- C和C++字符串删除等特定操作处理
- Vision_字符串_AC自动机
- BOS系统的设计与实现
- codeforces 868C Qualification Rounds