UVa 10305 Ordering Tasks 拓扑排序
来源:互联网 发布:keep健身软件音乐 编辑:程序博客网 时间:2024/06/06 14:04
这里的拓扑排序是基于DFS的,关于拓扑排序,紫书上说的比较清楚了。下面直接看代码:
首先是main函数:
其中G数组用来保存变量之间的关系,即若G[n][m] == 1,说明 n < m 。否则就是 n >= m; 关于c数组的用法紫书上解释了,但是没有放到代码中的解释可能看起来会比较吃力,等用到了c我们再解释不迟。topo数组用来保存经过拓扑排序之后的数据。
const int maxn = 100+5;int n, m, G[maxn][maxn], c[maxn], topo[maxn], t;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 //若toposort()返回false就说明图中存在换,不能进行拓扑排序,但是本题不用考虑这些 printf("No\n"); }}
现在看看toposort()函数:
bool dfs(int u){ //这个函数的作用就是根据u生成所有以u为起点的有向边 c[u] = -1; //c[u] == -1代表u正在进行dfs遍历 for(int v = 0; v < n; v++) if(G[u][v]) { //若u < v则进入 if(c[v]<0) return false; //若c[v] < 0 表示图中存在回路 else if(!c[v]) dfs(v); //若c[v] == 0 说明以v为起点的 有向边 还未生成 } c[u] = 1; topo[--t]=u; //c[u] == 1表示已经经过拓扑排序,并且将其值存入topo中 return true;}bool toposort(){ t = n; //为了将来存储排序后的数据 memset(c, 0, sizeof(c)); for(int u = 0; u < n; u++) if(!c[u]) //如果c[u]非零,即u已经经过拓扑排序,则跳过 if(!dfs(u)) return false; //如果dfs返回false,即图中存在回路,本题不用考虑 return true;}
关于拓扑排序的更多详细内容,可以参考这篇博客:http://blog.csdn.net/dm_vincent/article/details/7714519
阅读全文
0 0
- uva 10305 Ordering Tasks(拓扑排序)
- uva 10305 Ordering Tasks (拓扑排序)
- UVa 10305 Ordering Tasks (拓扑排序模板)
- [UVA 10305] Ordering Tasks (拓扑排序)
- UVa 10305 - Ordering Tasks 拓扑排序
- UVa 10305 Ordering Tasks(拓扑排序)
- UVa 10305 - Ordering Tasks 拓扑排序题解
- UVA - 10305 Ordering Tasks (拓扑排序)
- Ordering Tasks - UVa 10305 拓扑排序
- Uva 10305 Ordering Tasks(拓扑排序)
- Ordering Tasks From:UVA, 10305(拓扑排序)
- UVa 10305 - Ordering Tasks(拓扑排序)
- UVA - 10305 - Ordering Tasks (拓扑排序!)
- UVA - 10305 (Ordering Tasks) 拓扑排序
- UVa 10305 Ordering Tasks(拓扑排序)
- UVA 10305- Ordering Tasks(经典拓扑排序)
- uva 10305 Ordering Tasks 【拓扑排序】
- UVa 10305 - Ordering Tasks【拓扑排序】
- 简单整数运算(含限制条件)
- 2017.10.20(积性函数,BSGS,K进制数位DP)
- C语言——if-else语句嵌套
- c语言手动实现反转链表 Reverse
- ResNet-34 prototxt
- UVa 10305 Ordering Tasks 拓扑排序
- Springboot自定义异常处理
- 【bzoj3709】[PA2014]Bohater
- 分布式爬虫基本框架
- R语言学习笔记(一)数据结构
- 【tensorflow_error】tensorflow:importerror错误汇总
- tkinter: 事件 & 绑定 (Events and Bindings)
- 2017年10月18日普及组 文件名排序
- Scoket编程基础及tcp&udp的简介And区别