wa on #4 #6 #10 #11 #12
QWQ
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,t,ans=0,en=1,cnt=0;
struct POINT
{
int head,dfn,low,flag=0;
}p[200010];
struct EDGE
{
int nxt,num;
}e[2000010];
int addline(int x,int y)
{
e[en].num=y;
e[en].nxt=p[x].head;
p[x].head=en;
en++;
return 0;
}
int dfs(int now,int fa)
{
p[now].dfn=p[now].low=++cnt;
int son=0;
for(int i=p[now].head;i;i=e[i].nxt)
{
if(p[e[i].num].dfn==0)
{
dfs(e[i].num,now);
son++;
p[now].low=min(p[i].low,p[e[i].num].low);
if(p[e[i].num].low>=p[now].dfn && now!=t)
{
ans+=!p[now].flag;
p[now].flag=1;
}
}
else
{
if(e[i].num!=fa)
p[now].low=min(p[now].low,p[e[i].num].dfn);
}
}
if(son>=2 && now==t)
{
ans+=!p[now].flag;
p[now].flag=1;
}
return 0;
}
int main()
{
// freopen("P3388_4.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
addline(x,y);
addline(y,x);
}
for(int i=1;i<=n;i++)
if(p[i].dfn==0)
{
t=i;
cnt=0;
dfs(i,0);
}
printf("%d\n",ans);
ans=0;
for(int i=1;i<=n;i++)
if(p[i].flag==1)
printf("%d ",i);
return 0;
}