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
原创粉丝点击