strongly connected:
idea:
where to start?
This is a randomized algorithm for finding strongly connected components, consists of 2 DFS passes of the graph.
Example
Example
It consists of 3 routines: Kosaraju's, DFS-loop and DFS
Kosaraju's:
DFS-loop(graph $G$):
DFS(graph $G$, node $i$):
Running time: 2DFS = [math]O(n + m)[/math]
idea of the correctness:
public class StronglyConnectedComponents { private Graph graph; private int counter = 0; private int currentLeaderVertex = -1; private boolean visited[]; private int leaders[]; private int finishingTime[]; private int finishingTimeReversed[]; public void run() { graph = readGraph(); dfs1Loop(); dfs2Loop(); } public void dfs1Loop() { visited = new boolean[graph.getN()]; finishingTime = new int[graph.getN()]; Arrays.fill(finishingTime, -1); finishingTimeReversed = new int[graph.getN()]; Arrays.fill(finishingTimeReversed, -1); for (int i = graph.getN() - 1; i >= 0; i--) { if (!visited[i]) { currentLeaderVertex = i; dfs1(i); } } } private void dfs1(int u) { visited[u] = true; for (int v : graph.reverse(u)) { if (!visited[v]) { dfs1(v); } } finishingTime[u] = counter; finishingTimeReversed[counter] = u; counter++; } public void dfs2Loop() { visited = new boolean[graph.getN()]; leaders = new int[graph.getN()]; Arrays.fill(leaders, -1); for (int i = graph.getN() - 1; i >= 0; i--) { int ft = finishingTimeReversed[i]; if (!visited[ft]) { currentLeaderVertex = ft; dfs2(ft); } } } private void dfs2(int u) { visited[u] = true; leaders[u] = currentLeaderVertex; for (int v : graph.adjacent(u)) { if (!visited[v]) { dfs2(v); } } } }