-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathSCC.cpp
66 lines (56 loc) · 1 KB
/
SCC.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
const int MaxN = 10000;
struct edge {
int src, dst, w;
edge(int a, int b, int c) : src(a), dst(b), w(c) {}
};
typedef vector<edge> Graph;
int n, m;
Graph g[MaxN];
Graph gt[MaxN];
int order[MaxN], mk[MaxN];
int scc[MaxN];
int vcount[MaxN];
int cur;
int cur_scc;
void dfs(int u) {
mk[u] = true;
for (int i = 0; i < (int)g[u].size(); ++i) {
int v = g[u][i].dst;
if (!mk[v])
dfs(v);
}
order[n - 1 - cur++] = u;
}
void dfs_rev(int u) {
scc[u] = cur_scc;
++vcount[cur_scc];
mk[u] = true;
for (int i = 0; i < (int)gt[u].size(); ++i) {
int v = gt[u][i].dst;
if (!mk[v])
dfs_rev(v);
}
}
void make_scc() {
cur = 0;
memset(mk, 0, sizeof(mk));
for (int i = 0; i < n; ++i)
if (!mk[i])
dfs(i);
cur_scc = 0;
memset(mk, 0, sizeof(mk));
for (int i = 0; i < n; ++i) {
int v = order[i];
if (!mk[v]) {
dfs_rev(v);
++cur_scc;
}
}
}
void init() {
for (int i = 0; i < n; ++i) {
g[i].clear();
gt[i].clear();
vcount[i] = 0;
}
}