On this page
article
Kosaraju
Sobre
O(n + m)
Link original: kosaraju.cpp
Código
int n;
vector<int> g[MAX];
vector<int> gi[MAX]; // grafo invertido
int vis[MAX];
stack<int> S;
int comp[MAX]; // componente conexo de cada vertice
void dfs(int k) {
vis[k] = 1;
for (int i = 0; i < (int) g[k].size(); i++)
if (!vis[g[k][i]]) dfs(g[k][i]);
S.push(k);
}
void scc(int k, int c) {
vis[k] = 1;
comp[k] = c;
for (int i = 0; i < (int) gi[k].size(); i++)
if (!vis[gi[k][i]]) scc(gi[k][i], c);
}
void kosaraju() {
for (int i = 0; i < n; i++) vis[i] = 0;
for (int i = 0; i < n; i++) if (!vis[i]) dfs(i);
for (int i = 0; i < n; i++) vis[i] = 0;
while (S.size()) {
int u = S.top();
S.pop();
if (!vis[u]) scc(u, u);
}
}