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 Generate a Graph for a Given Fixed Degree Sequence
Optional trong Java 8
Java Program to Implement Borwein Algorithm
Finding Max/Min of a List or Collection
How to Get All Spring-Managed Beans?
Spring Security Custom AuthenticationFailureHandler
Using Optional with Jackson
Java Program to Describe the Representation of Graph using Adjacency Matrix
Java Program to Find the Shortest Path Between Two Vertices Using Dijkstra’s Algorithm
Java Program to Implement Heap
Java Program to Implement Coppersmith Freivald’s Algorithm
Java Program to Check if a Matrix is Invertible
Beans and Dependency Injection
Intro to Inversion of Control and Dependency Injection with Spring
Convert Hex to ASCII in Java
The Spring @Controller and @RestController Annotations
Hướng dẫn Java Design Pattern – Bridge
@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll
Spring Boot - Web Socket
Java Program to Use Boruvka’s Algorithm to Find the Minimum Spanning Tree
Java Program to Implement Suffix Array
Java Program to Implement Rolling Hash
Spring Security Basic Authentication
Java Program to Encode a Message Using Playfair Cipher
Compact Strings in Java 9
Java Program to Find the Shortest Path from Source Vertex to All Other Vertices in Linear Time
How To Serialize and Deserialize Enums with Jackson
Java Program to Implement Fisher-Yates Algorithm for Array Shuffling
Java Program to Implement Warshall Algorithm
Spring Security OAuth2 – Simple Token Revocation
Java Program to Implement Trie
Spring Cloud – Bootstrapping