uva 10305 拓扑排序

拓扑排序

可以用DFS求出有向无环图(DAG)的拓扑排序。如果排序失败,说明该有向图存在有向环,不是DAG。

// uva 10305
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int G[105][105] ;
int vis[105];
int sort[105];
int t;
int m,n;
bool dfs(int u){
	vis[u]=-1;
					// 标记正在访问点
	for(int v=1;v<=m;v++){
		if(G[u][v]) {   // 以u开始延申 
		if(vis[v]<0) return false;    //如果又遇到正在访问的点则成环 
		else if( !vis[v]&&!dfs(v))  return false;	
		//  v 点没有被访问  访问v进入v点  且若访问遇到环则dfs return false 
		} 
	} 
	vis[u]=1;  //访问结束标志 
	sort[--t]=u;
	return true; 
}

int main(){
	//freopen("10305.txt","r",stdin);

	while(~scanf("%d%d",&m,&n)&&m+n){ // n 可能是0
		memset(G,0,sizeof(G));
		
		memset(vis,0,sizeof(vis));
		t=m;
		for(int i=0;i<n;i++){
			int u,v;
			scanf("%d%d",&u,&v);
			G[u][v]=1;
		} 
		for(int i=1;i<=m;i++){
			if(!vis[i])
				dfs(i);		
		}
		for(int i=0;i<m;i++){
				cout<<sort[i]<<" ";
		}
		cout<<endl;		
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/chichina/p/12667031.html