void Find(DirectedGraph graph) { //1. Postorder + stack //2. Reverse graph //3. Classic DFS //1. Postorder var stack = new Stack <int>(); bool[] visited = new bool[graph.V]; for (int i = 0; i < graph.V; i++) { if (!visited[i]) { PostOrder(i, stack, visited, graph); } } //2. Reverse graph var reversed = graph.Reverse(); //3. Classic DFS visited.Fill(false); while (stack.Count > 0) { var vertex = stack.Pop(); if (!visited[vertex]) { var scc = new StronglyConnectedComponent(); FillStronglyConnectedComponent(vertex, visited, reversed, scc); StronglyConnectedComponents.Add(scc); } } }
void FillStronglyConnectedComponent(int vertex, bool[] visited, DirectedGraph graph, StronglyConnectedComponent scc) { visited[vertex] = true; scc.Vertices.Add(vertex); foreach (var adj in graph.GetVertexAdjcency(vertex)) { if (!visited[adj]) { FillStronglyConnectedComponent(adj, visited, graph, scc); } } }