uva 10305 clasificación topológica

clasificación topológica

DFS se puede usar para obtener un gráfico acíclico dirigido (DAG) de clasificación de topología. Si el tipo falla, lo que indica que la presencia del anillo tiene que no figura 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;
}

Supongo que te gusta

Origin www.cnblogs.com/chichina/p/12667031.html
Recomendado
Clasificación