#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;
}
转载于:https://www.cnblogs.com/heroliu/p/10803298.html