1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 int n,m; 6 const int maxn=1e5+2; 7 const int maxm=maxn<<1; 8 struct node 9 { 10 int to; 11 int nxt; 12 }e[maxm]; 13 int head[maxn]; 14 int tot; 15 int id; 16 int root; 17 int low[maxn]; 18 int num[maxn]; 19 bool vis[maxn]; 20 int pa[maxn]; 21 int cnt=0; 22 int art[maxn]; 23 void init() 24 { 25 memset(head,-1,sizeof(head)); 26 tot=0; 27 id=0; 28 memset(low,-1,sizeof(low)); 29 memset(num,-1,sizeof(num)); 30 memset(vis,false,sizeof(vis)); 31 memset(pa,-1,sizeof(pa)); 32 cnt=0; 33 memset(art,0,sizeof(art)); 34 } 35 void add(int u,int v) 36 { 37 e[tot].to=v; 38 e[tot].nxt=head[u]; 39 head[u]=tot++; 40 } 41 void findArt(int u) 42 { 43 vis[u]=true; 44 low[u]=num[u]=++id; 45 for(int i=head[u];i!=-1;i=e[i].nxt) 46 { 47 int v=e[i].to; 48 //树边 49 if(!vis[v]) 50 { 51 pa[v]=u; 52 findArt(v); 53 if(low[v]>=num[u]&&u!=root) 54 { 55 art[cnt++]=u; 56 } 57 low[u]=min(low[u],low[v]); 58 } 59 else if(pa[v]!=u) //回退边 60 { 61 low[u]=min(low[u],num[v]); 62 } 63 } 64 } 65 66 void printArt() 67 { 68 int tmp=0; 69 for(int i=head[root];i!=-1;i=e[i].nxt) 70 { 71 if(pa[e[i].to]==root) tmp++; 72 } 73 if(tmp>=2) art[cnt++]=root; 74 for(int i=0;i<cnt;i++) 75 { 76 printf("%d ",art[i]); 77 } 78 puts(""); 79 } 80 81 int main() 82 { 83 while(~scanf("%d%d",&n,&m)) 84 { 85 init(); 86 int u,v; 87 for(int i=1;i<=m;i++) 88 { 89 scanf("%d%d",&u,&v); 90 add(u,v); 91 add(v,u); 92 } 93 root=1; 94 findArt(root); 95 printArt(); 96 } 97 return 0; 98 }