Kosaraju
Time O(V + E) Space O(V + E)Iterative finish-order DFS, then count DFS starts on the reversed graph.
n = 5, edges = [[0,1],[1,2],[2,0],[1,3],[3,4]]finish order(list)
Step 1/4First DFS from 0: 2 finishes first, then 4, 3, 1 and finally 0. Each is pushed on a stack, so 0 is on top.
import java.util.*;
class Solution {
private List<List<Integer>> g, rg;
private boolean[] seen;
private final Deque<Integer> order = new ArrayDeque<>();
public int countSCC(int n, int[][] edges) {
g = new ArrayList<>();
rg = new ArrayList<>();
for (int i = 0; i < n; i++) { g.add(new ArrayList<>()); rg.add(new ArrayList<>()); }
for (int[] e : edges) { g.get(e[0]).add(e[1]); rg.get(e[1]).add(e[0]); }
seen = new boolean[n];
for (int i = 0; i < n; i++) if (!seen[i]) finish(i);
seen = new boolean[n];
int count = 0;
while (!order.isEmpty()) {
int u = order.pop();
if (seen[u]) continue;
count++;
collect(u);
}
return count;
}
private void finish(int u) {
seen[u] = true;
for (int v : g.get(u)) if (!seen[v]) finish(v);
order.push(u);
}
private void collect(int u) {
seen[u] = true;
for (int v : rg.get(u)) if (!seen[v]) collect(v);
}
}Verdict: Two simple passes.