Java Program to Implement Gabow Algorithm

This is a Java Program to Implement Gabow Algorithm. Gabow algorithm is used for finding all strongly connected components in a graph.

Here is the source code of the Java Program to Implement Gabow Algorithm. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

/**
 *     Java Program to Implement Gabow Algorithm
 **/
 
import java.util.*;
 
/** class Gabow **/
class Gabow
{
    /** number of vertices **/
    private int V;    
    /** preorder number counter **/
    private int preCount;
    private int[] preorder;
    /** to check if v is visited **/
    private boolean[] visited;  
    /** check strong componenet containing v **/
    private boolean[] chk;    
    /** to store given graph **/
    private List<Integer>[] graph;
    /** to store all scc **/
    private List<List<Integer>> sccComp;
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
 
    /** function to get all strongly connected components **/
    public List<List<Integer>> getSCComponents(List<Integer>[] graph) 
    {
        V = graph.length;
        this.graph = graph;
        preorder = new int[V];
        chk = new boolean[V]; 
        visited = new boolean[V];
        stack1 = new Stack<Integer>();
        stack2 = new Stack<Integer>();
        sccComp = new ArrayList<>();
 
        for (int v = 0; v < V; v++)
              if (!visited[v])
                dfs(v);
 
        return sccComp;
      }
    /** function dfs **/
    public void dfs(int v) 
    {
        preorder[v] = preCount++;
        visited[v] = true;
        stack1.push(v);
        stack2.push(v);
 
        for (int w : graph[v]) 
        {
            if (!visited[w])
                dfs(w);
            else if (!chk[w]) 
                while (preorder[stack2.peek()] > preorder[w])
                    stack2.pop();            
        }
        if (stack2.peek() == v) 
        {
            stack2.pop();
            List<Integer> component = new ArrayList<Integer>();
            int w;
            do 
            {
                w = stack1.pop();
                component.add(w);
                chk[w] = true;
            } while (w != v);  
            sccComp.add(component);            
        }                       
    }    
    /** main **/
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Gabow algorithm Test\n");
        System.out.println("Enter number of Vertices");
        /** number of vertices **/
        int V = scan.nextInt();
 
        /** make graph **/
        List<Integer>[] g = new List[V];        
        for (int i = 0; i < V; i++)
            g[i] = new ArrayList<Integer>();        
        /** accpet all edges **/
        System.out.println("\nEnter number of edges");
        int E = scan.nextInt();
        /** all edges **/
        System.out.println("Enter "+ E +" x, y coordinates");
        for (int i = 0; i < E; i++)
        {
            int x = scan.nextInt();
            int y = scan.nextInt();
            g[x].add(y);
        }    
 
        Gabow gab = new Gabow();        
        System.out.println("\nSCC : ");
        /** print all strongly connected components **/
        List<List<Integer>> scComponents = gab.getSCComponents(g);
        System.out.println(scComponents);        
    }    
}
Gabow algorithm Test
 
Enter number of Vertices
8
 
Enter number of edges
14
Enter 14 x, y coordinates
0 1
1 2
2 3
3 2
3 7
7 3
2 6
7 6
5 6
6 5
1 5
4 5
4 0
1 4
 
SCC :
[[5, 6], [7, 3, 2], [4, 1, 0]]

Related posts:

Java Program to Implement a Binary Search Algorithm for a Specific Search Sequence
Remove the First Element from a List
Java Program to Implement Rolling Hash
Java Program to Implement Extended Euclid Algorithm
Working with Tree Model Nodes in Jackson
Spring Boot - Web Socket
Programmatic Transaction Management in Spring
How to Get All Spring-Managed Beans?
Java Program to find the maximum subarray sum using Binary Search approach
Spring Cloud – Securing Services
Create a Custom Auto-Configuration with Spring Boot
Tạo số và chuỗi ngẫu nhiên trong Java
Join and Split Arrays and Collections in Java
A Guide to HashSet in Java
Java Program to Search for an Element in a Binary Search Tree
Java Program to Implement Multi-Threaded Version of Binary Search Tree
Most commonly used String methods in Java
Java Program to Find All Pairs Shortest Path
Convert String to int or Integer in Java
Java Program to Implement Quick Sort with Given Complexity Constraint
Java Program to Apply Above-Below-on Test to Find the Position of a Point with respect to a Line
Introduction to Netflix Archaius with Spring Cloud
Transaction Propagation and Isolation in Spring @Transactional
Spring MVC Custom Validation
Immutable ArrayList in Java
How to Read a File in Java
Implementing a Binary Tree in Java
“Stream has already been operated upon or closed” Exception in Java
Java Program to Check whether Graph is a Bipartite using DFS
Java Program to Generate N Number of Passwords of Length M Each
Java Program to Implement ConcurrentSkipListMap API
The Order of Tests in JUnit