tarjan割点算法代码实现

#include<iostream>
using namespace std;
int n,m,x,y;
int e[9][9];
int root=1;
int timex;//时间戳 
int num[9],low[9],flag[9];//flag标记割点 
int min(int a,int b){
	
	if(a<b){
		return a;
	}else{
		return b;
	}
}

void dfs(int cur,int father){
	int child=0;
	timex++;
	num[cur]=timex;
	low[cur]=timex;
	for(int i=0;i<n;i++){
		if(e[cur][i]==1&&num[i]==0){//是否联通,是否被访问过 
			child++;
			dfs(i,cur);
			low[cur]=min(low[cur],low[i]);
			if(cur!=root&&low[i]>=num[cur]){
				flag[cur]=1;
			}else if(cur==root&&child>=2){
				flag[cur]=1;
			}
		}
		
		if(e[cur][i]==1&&num[i]==1){//联通,但被访问过 
			if(i!=father){//i不是当前节点的父亲,就是说i是当前节点的祖先 
			   low[cur]=min(low[cur],num[i]); 
			}
		} 
		
		
	} 
}
int main(){
	
	
	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			e[i][j]=0;
		}
	}
	for(int j=0;j<m;j++){
		cin>>x>>y;
		e[x][y]=1;
		e[y][x]=1;
	}
	
	dfs(1,root);
	for(int i=0;i<n;i++){
		if(flag[i]==1){
			cout<<i<<" ";
		}
	} 
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/heroliu/p/10803298.html