#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
时间: 2024-11-12 02:20:58