1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//
// P3388 【模板】割点(割顶)
// OI
//
// Created by ChrAlpha on 2019/11/12.
// Last updated on 2019/11/12.
// Copyright @ 2019年 ChrAlpha. All rights reserved.
//

#include <bits/stdc++.h>

#define int long long
#define lli long long
#define FO(i,x,y) for(int i=(x);i<=(y);++i)
#define DF(i,x,y) for(int i=(x);i>=(y);--i)
#define CL(f,x) memset(f,x,sizeof(f))

using namespace std;

const int sz=100005;

void re(int &x) {
x=0;char ch=getchar();bool nf=0;
while(ch<'0' || ch>'9') nf|=(ch=='-'),ch=getchar();
while(ch>='0' && ch<='9') x=((x<<3)+(x<<1))+ch-'0',ch=getchar();
if(nf) x=-x;
}

struct Edge {
int to,nxt;
}e[sz<<1];

int dfn[sz],low[sz],tim,n,m,head[sz],tot,cnt,rk[sz],rnk,ans[sz];
bool vis[sz],kvis[sz];

inline void add(int u,int v) {
e[++tot].to=v;
e[tot].nxt=head[u];
head[u]=tot;
}

stack<int> t;

void dfs(int u,int rt) {
if(vis[u]) {
return;
}
vis[u]=1;
dfn[u]=low[u]=++tim;
t.push(u);
int ch=0;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].to;
if(!dfn[v]) {
dfs(v,rt);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u] && u!=rt) {
ans[u]=1;
}
if(u==rt) {
ch++;
}
} else if(vis[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]) {
++rnk;
while(t.top()!=u) {
rk[t.top()]=rnk;
vis[t.top()]=0;
t.pop();
}
rk[u]=rnk,t.pop();
}
if(u==rt && ch>=2) {
ans[rt]=1;
}
}

signed main() {
#ifdef debug
freopen("17.txt","r",stdin);
#endif
re(n),re(m);
FO(i,1,m) {
int u,v;
re(u),re(v);
add(u,v),add(v,u);
}
FO(i,1,n) {
if(!dfn[i]) {
dfs(i,i);
}
}
int cnt=0;
FO(i,1,n) {
if(ans[i]) {
cnt++;
}
}
printf("%lld\n",cnt);
FO(i,1,n) {
if(ans[i]) {
printf("%lld ",i);
}
}
return 0;
}

 Comments