有向图找环

#include<iostream>
//蓝桥第9届 c语言c组第9题
//小朋友的崇拜圈 
//有向图找环 dfs
using namespace std;
int map[100][100]={0}; //邻接矩阵 
int visit[100]={0}; // 状态数组 
int path[100];     //环的元素 
int m=0;

int v=30; //点的个数 


/*
	visit数组表示当前点的状态
	0 表示还没访问过
	1 表示正在访问
	-1 表示访问结束 

*/
void dfs(int k){
	visit[k]=1;//正在访问 
	path[m++]=k;
	for(int i=1;i<=v;i++){
		
		if(map[k][i]==1){//2个点之间有边 
			
			if(visit[i]==0){
				dfs(i);	  //递归去访问 
			}
			if(visit[i]==1){ //出现环 打印出来 
			cout<<"环:";
				for(int j=m-1;;j--){
					cout<<path[j]<<' ';
					if(path[j]==i)
						break;
					
				} 
				
				cout<<endl;

				
			
			}
			
			if(visit[i]==-1)//表示当前点访问过
			{
				continue;
			} 
		}	
	}
	visit[k]=-1;  //访问结束 
	m--;                                                                                                      
}





int main(){
	int a[]={22,28,16,6,27,21,30,1,29,10,9,14,24,11,7,2,8,5,26,4,12,3,25,18,20,19,23,17,13,15};
	v=30;

		for(int i=0;i<v;i++){
		map[i+1][a[i]]=1;
	}

	

	
	for(int i=1;i<=v;i++){
		if(visit[i]!=-1)
			dfs(i);
	}
	return 0;
} 






猜你喜欢

转载自blog.csdn.net/qq_40066334/article/details/86677897