-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArticulation.cpp
87 lines (85 loc) · 1.95 KB
/
Articulation.cpp
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
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void dfs(int node, int parent, vector<int> &disc, vector<int> &low, unordered_map<int, bool> &vis,
unordered_map<int, list<int>> &adj, vector<int> &ap, int &timer)
{
vis[node] = true;
disc[node] = low[node] = timer++;
int child = 0;
for (auto nbr : adj[node])
{
if (nbr == parent)
{
continue;
}
if (!vis[nbr])
{
dfs(nbr, node, disc, low, vis, adj, ap, timer);
low[node] = min(low[node], low[nbr]);
// check AP or not
if (low[nbr] >= disc[node] && parent != -1)
{
ap[node] = true;
}
child++;
}
else
{
low[node] = min(low[node], disc[nbr]);
}
}
if (parent == -1 && child > 1)
{
ap[node] = -1;
}
}
int main()
{
int n = 5;
int e = 5;
vector<pair<int, int>> edges;
edges.push_back(make_pair(0, 3));
edges.push_back(make_pair(3, 4));
edges.push_back(make_pair(0, 4));
edges.push_back(make_pair(0, 1));
edges.push_back(make_pair(1, 2));
// adj list
unordered_map<int, list<int>> adj;
for (int i = 0; i < edges.size(); i++)
{
int u = edges[i].first;
int v = edges[i].second;
adj[u].push_back(v);
adj[v].push_back(u);
}
int timer = 0;
vector<int> disc(n);
vector<int> low(n);
unordered_map<int, bool> vis;
vector<int> ap(n, 0);
for (int i = 0; i < n; i++)
{
disc[i] = -1;
low[i] = -1;
}
// dfs
for (int i = 0; i < n; i++)
{
if (!vis[i])
{
dfs(i, -1, disc, low, vis, adj, ap, timer);
}
}
// print ap
cout << "Articulation points are" << endl;
for (int i = 0; i < n; i++)
{
if (ap[i] != 0)
{
cout << i << " ";
}
cout << endl;
}
return 0;
}