题目来自:添加链接描述
#include <cstdio>
#include <cstring>
#include <vector>
#include<iostream>
#include <algorithm>
#define maxd 20000+5
using namespace std;
int low[maxd],num[maxd],dfn=0,tot=0;
bool iscut[maxd];
vector<int>G[maxd];
void dfs(int u,int mr){
int rc=0;
num[u]=low[u]=++dfn;
for (int i=0;i<G[u].size();i++){
int v=G[u][i];
if (!num[v]){
dfs(v,mr);
low[u]=min(low[u],low[v]);
if (low[v]>=num[u]&&u!=mr) iscut[u]=true;
if (u==mr) rc++;
}
low[u]=min(low[u],num[v]);
}
if (u==mr&&rc>=2) iscut[mr]=true;
}
/*void dfs(int u,int fa){
low[u]=num[u]=++dfn;
int child =0;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!num[v]){
dfs(v,u);
low[u]=min(low[v],low[u]);
if(low[v]>=num[u]&&u!=fa){
iscut[u]=true;
}
if(u==fa) child++;
}
else {
if(num[v]<num[u]&&v!=fa)
low[u]=min(low[u],num[v]);
}
}
if(u==fa&&child>=2) iscut[fa]=true;
}*/
int main() {
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++){
if(!num[i]){
dfs(i,i);
}
}
for (int i=1;i<=n;i++)
if (iscut[i])
tot++;
printf("%d\n",tot);
for(int i=1;i<=n;i++){
if(iscut[i])
printf("%d ",i);
}
return 0;
}