/*
割点判断
tarjan
by sbn
*/
#include<iostream>
#include<cstdio>
using namespace std;
struct node{
int x,y,nxt;
node(){}
node(int nx,int ny,int nnxt){
x=nx;y=ny;nxt=nnxt;
}
}tree[400001];
int head[400001],cnt_e,n,m,dep;
int dfn[400001],low[400001],root;
bool flag[400001];
void build(int x,int y){
tree[++cnt_e]=node(x,y,head[x]);
head[x]=cnt_e;
tree[++cnt_e]=node(y,x,head[y]);
head[y]=cnt_e;
}
void dfs(int u,int f){
dep++;
int child=0;
dfn[u]=low[u]=dep;
int z=head[u];
while (z){
if (dfn[tree[z].y]<=0){
child++;
dfs(tree[z].y,u);
low[u]=min(low[u],low[tree[z].y]);
if (u!=root&&dfn[u]<=low[tree[z].y]) flag[u]=1;
if (u==root&&child>1) flag[u]=1;
}
else{
if (tree[z].y!=f) low[u]=min(low[u],dfn[tree[z].y]);
}
z=tree[z].nxt;
}
}
int main(){
//freopen("gedianpanduan.in","r",stdin);
cin>>n>>m;
for (int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
build(a,b);
}
for (int i=1;i<=n;i++)if (head[i]!=0){root=i;break;}
dfs(root,1);
int num=0;
for (int i=1;i<=n;i++)if (flag[i]) num++;
cout<<num<<endl;
for (int i=1;i<=n;i++)if (flag[i]) cout<<i<<" ";
return 0;
}
割点判断(tarjan)
最新推荐文章于 2025-06-12 12:22:17 发布