-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathArticulation Point.cpp
130 lines (108 loc) · 2.95 KB
/
Articulation Point.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <cstdio>
#include <cmath>
#include <iostream>
#include <string.h> // For memset function
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <algorithm>
#include <bitset>
#include <sstream>
#include <map>
using namespace std;
#define FOR( i, L, U ) for(int i=(int)L ; i<=(int)U ; i++ )
#define FORD( i, U, L ) for(int i=(int)U ; i>=(int)L ; i-- )
#define SQR(x) ((x)*(x))
#define INF 99999999
#define SZ size()
#define PB push_back
#define PF push_front
#define READ(filename) freopen(filename, "r", stdin);
#define WRITE(filename) freopen(filename, "w", stdout);
typedef long long LL;
typedef vector<int> VI;
typedef vector<vector<int> > VVI;
typedef vector<double> VD;
typedef vector<char> VC;
typedef vector<string> VS;
typedef pair<int, int> II;
typedef map<int, int> MII;
typedef map<char, int> MCI;
typedef map<string, int> MSI;
typedef map<string, char> MSC;
#define WHITE 0
#define GRAY 1
#define BLACK 2
int NODE, EDGE;
VVI G;
VI color, dfsNum, dfsLow, parent;
int nodeNum;
vector<bool> articulationVertex;
vector<II> articulationBridge;
int dfsRoot, rootChildren;
void articulationPointAndBridge(int u)
{
dfsNum[u] = dfsLow[u] = nodeNum++;
color[u] = GRAY;
FOR(i, 0, G[u].SZ-1) {
int v = G[u][i];
if(color[v] == WHITE) {
parent[v] = u;
if(u == dfsRoot) rootChildren++;
articulationPointAndBridge(v);
if(dfsLow[v] >= dfsNum[u]) articulationVertex[u] = true;
if(dfsLow[v] > dfsNum[u]) {
articulationBridge.PB(II(u, v));
}
dfsLow[u] = min(dfsLow[u], dfsLow[v]);
}
else if(v != parent[u])
dfsLow[u] = min(dfsLow[u], dfsNum[v]);
}
color[u] = BLACK;
}
int main()
{
READ("input.txt");
WRITE("output.txt");
int i, j, k;
int TC, tc;
int u, v;
while(cin >> NODE >> EDGE) {
G = VVI(NODE+1);
color = VI(NODE+1, WHITE);
dfsNum = VI(NODE+1);
dfsLow = VI(NODE+1);
parent = VI(NODE+1, -1);
articulationVertex = vector<bool>(NODE+1, false);
FOR(i, 1, EDGE) {
cin >> u >> v;
G[u].PB(v);
G[v].PB(u);
}
nodeNum = 0;
FOR(i, 0, NODE-1) {
if(color[i] == WHITE) {
dfsRoot = i;
rootChildren = 0;
articulationPointAndBridge(i);
articulationVertex[dfsRoot] = (rootChildren > 1);
}
}
FOR(i, 1, NODE) {
cout << dfsNum[i] << " " << dfsLow[i] << "\n";
}
cout << "Articulation Points:\n";
FOR(i, 1, NODE) {
if(articulationVertex[i] == true)
cout << i << " ";
}
cout << "\n";
cout << "Articulation Bridge:\n";
FOR(i, 0, articulationBridge.SZ-1)
cout << articulationBridge[i].first << " " << articulationBridge[i].second << "\n";
}
return 0;
}