1.根节点,有2棵及以上子树
2.非根节点,有子节点dfn[u]<=low[v]
#include <bits/stdc++.h> #define N 1000050 using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } int head[N],dfn[N],low[N],cut[N]; int cnt,idx; struct node{int v,next;}e[2*N]; void insert(int u,int v){ e[++cnt]=(node){v,head[u]};head[u]=cnt; e[++cnt]=(node){u,head[v]};head[v]=cnt; } void tarjan(int u,int f){ dfn[u]=low[u]=++idx; int rs=0; for(int i=head[u];i;i=e[i].next){ int v=e[i].v; if(!dfn[v]){ tarjan(v,f);rs++; low[u]=min(low[u],low[v]); if((u==f&&2<=rs)||(u!=f&&dfn[u]<=low[v])) cut[u]=1; }else low[u]=min(low[u],dfn[v]); } } int n,m,ans; int main(){ n=read(),m=read(); for(int i=1;i<=m;i++){ int x=read(),y=read(); insert(x,y); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,i); for(int i=1;i<=n;i++) if(cut[i]) ans++; printf("%d\n",ans); for(int i=1;i<=n;i++) if(cut[i]) printf("%d ",i); return 0; }