-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathkosaraju.cpp
47 lines (47 loc) · 1.25 KB
/
kosaraju.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
namespace kosaraju {
const int N = 1e5 + 5;
int n, vis[N], root[N];
vector<int> adj[N], inv[N], gc[N], topo;
void add_edge(int u, int v) {
adj[u].emplace_back(v);
inv[v].emplace_back(u);
}
void toposort(int u) {
vis[u] = 1;
for (auto v : adj[u]) {
if (vis[v]) continue;
toposort(v);
}
topo.emplace_back(u);
}
void dfs(int u) {
vis[u] = 1;
for (auto v : inv[u]) {
if (vis[v]) continue;
root[v] = root[u];
dfs(v);
}
}
void solve(int n) {
fill(vis, vis + n, 0);
topo.clear();
for (int i = 0; i < n; i++)
if (!vis[i]) toposort(i);
fill(vis, vis + n, 0);
iota(root, root + n, 0);
for (int i = n - 1; i >= 0; i--)
if (!vis[topo[i]]) dfs(topo[i]);
set<pair<int, int>> st;
for (int u = 0; u < n; u++) {
int ru = root[u];
for (int v : adj[u]) {
int rv = root[v];
if (ru == rv) continue;
if (!st.count(ii(ru, rv))) {
gc[ru].emplace_back(rv);
st.insert(ii(ru, rv));
}
}
}
}
}