-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBOJ_11266.cpp
More file actions
61 lines (57 loc) · 1.32 KB
/
BOJ_11266.cpp
File metadata and controls
61 lines (57 loc) · 1.32 KB
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
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> edges;
vector<int> ids;
vector<int> articulation_points;
int id = 1;
int dfs(int current, int parent, bool isRoot) {
int res = id++;
ids[current] = res;
int child_cnt = 0;
bool isArticulationPoint = false;
for (auto &i : edges[current]) {
if (i == parent)
continue;
if (ids[i] != 0) {
res = min(res, ids[i]);
continue;
}
child_cnt++;
int child_res = dfs(i, current, false);
if (!isArticulationPoint && !isRoot && child_res >= ids[current]) {
articulation_points.push_back(current);
isArticulationPoint = true;
}
res = min(res, child_res);
}
if (isRoot && child_cnt >= 2) {
articulation_points.push_back(current);
}
return res;
}
int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0);
int v, e;
cin >> v >> e;
edges.assign(v + 1, vector<int>());
ids.assign(v + 1, 0);
while (e--) {
int a, b;
cin >> a >> b;
edges[a].push_back(b);
edges[b].push_back(a);
}
for (int i = 1; i <= v; i++) {
if (ids[i] == 0)
dfs(i, 0, true);
}
sort(articulation_points.begin(), articulation_points.end());
cout << articulation_points.size() << "\n";
for (auto &i : articulation_points) {
cout << i << " ";
}
return 0;
}