diff --git a/src/main/java/com/thealgorithms/graph/stronglyConnectedComponent_Optimized.java b/src/main/java/com/thealgorithms/graph/stronglyConnectedComponent_Optimized.java new file mode 100644 index 000000000000..2c98be12693e --- /dev/null +++ b/src/main/java/com/thealgorithms/graph/stronglyConnectedComponent_Optimized.java @@ -0,0 +1,76 @@ +import java.util.List; +import java.util.Stack; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + +public class stronglyConnectedComponent_Optimized { + + public void btrack(HashMap> adjList, int[] visited, Stack dfsCallsNodes, int currentNode) { + visited[currentNode] = 1; + for (int i = 0; i < adjList.get(currentNode).size(); i++) { + int neighbor = adjList.get(currentNode).get(i); + if (visited[neighbor] == -1) { + btrack(adjList, visited, dfsCallsNodes, neighbor); + } + } + dfsCallsNodes.add(currentNode); + } + + public void btrack2(HashMap> adjRevList, int[] visited, int currentNode, List newScc) { + visited[currentNode] = 1; + newScc.add(currentNode); + for (int i = 0; i < adjRevList.get(currentNode).size(); i++) { + int neighbor = adjRevList.get(currentNode).get(i); + if (visited[neighbor] == -1) { + btrack2(adjRevList, visited, neighbor, newScc); + } + } + } + + public int getOutput(HashMap> adjList, int N) { + int[] visited = new int[N]; + Arrays.fill(visited, -1); + Stack dfsCallsNodes = new Stack<>(); + + + for (int i = 0; i < N; i++) { + if (visited[i] == -1) { + btrack(adjList, visited, dfsCallsNodes, i); + } + } + + + + + HashMap> adjRevList = new HashMap<>(); + for (int i = 0; i < N; i++) { + adjRevList.put(i, new ArrayList<>()); + } + + for (int i = 0; i < N; i++) { + for (int neighbor : adjList.get(i)) { + adjRevList.get(neighbor).add(i); + } + } + + + Arrays.fill(visited, -1); + int stronglyConnectedComponents = 0; + List> sccs = new ArrayList<>(); + + while (!dfsCallsNodes.isEmpty()) { + int node = dfsCallsNodes.pop(); + if (visited[node] == -1) { + List newScc = new ArrayList<>(); + btrack2(adjRevList, visited, node, newScc); + sccs.add(newScc); + stronglyConnectedComponents++; + } + } + + + return stronglyConnectedComponents; + } + +}