UVA 10305 Ordering Tasks

开心!我又从书上学会了拓扑排序!

从别人博客上转过来的一句话:
  关键在于为什么在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;
}


你可能感兴趣的:(拓扑排序,uva)