UVA 10305 Ordering Tasks
来源:互联网 发布:域名投资人联系 编辑:程序博客网 时间:2024/06/04 19:14
开心!我又从书上学会了拓扑排序!
从别人博客上转过来的一句话:
关键在于为什么在visit方法的最后将该顶点添加到一个集合中,就能保证这个集合就是拓扑排序的结果呢?
因为添加顶点到集合中的时机是在dfs方法即将退出之时,而dfs方法本身是个递归方法,只要当前顶点还存在边指向其它任何顶点,它就会递归调用dfs方法,而不会退出。因 此,退出dfs方法,意味着当前顶点没有指向其它顶点的边了,即当前顶点是一条路径上的最后一个顶点。
#include <iostream>#include <cstring>#include <cstdio>const int MAX=1000;int n,m,g[MAX][MAX],c[MAX],topo[MAX],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);}}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]&&!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");}return 0;}
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
- UVa 10305Ordering Tasks
- Uva 10305 - Ordering Tasks
- uva 10305Ordering 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
- UVA - 10305 Ordering Tasks
- {Effective Java} Chap 5 Generics
- git——Mac下github的使用
- HMM简单理解
- tcp报文格式udp报文格式详解
- mysql(七、创建、修改、更新视图)
- UVA 10305 Ordering Tasks
- 黑马程序员——Java语言:IO
- TCP/IP详解卷1 读书笔记:第四章 ARP地址解析协议
- poj(1505)——Copying Books
- C#解析xml/json/excel
- 如何用代码禁用SpriteBuilder中创建的关节
- 用递归实现二分查找 JAVA
- 数据细节
- xiaok海洋测绘网全新改版(使用emlog)