Monday, 27 November 2017

Java Program to Implement Gabow Algorithm


Code:

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[] graph;
    /** to store all scc **/
    private List> sccComp;
    private Stack stack1;
    private Stack stack2;

    /** function to get all strongly connected components **/
    public List> getSCComponents(List[] graph) 
    {
        V = graph.length;
        this.graph = graph;
        preorder = new int[V];
        chk = new boolean[V]; 
        visited = new boolean[V];
        stack1 = new Stack();
        stack2 = new Stack();
        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 component = new ArrayList();
            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[] g = new List[V];        
        for (int i = 0; i < V; i++)
            g[i] = new ArrayList();        
        /** 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> scComponents = gab.getSCComponents(g);
        System.out.println(scComponents);        
    }    
}


Output:

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]]



More Java Programs:



















100+ Best Home Decoration Ideas For Christmas Day 2019 To Make Home Beautiful

Best gifts for Christmas Day | Greeting cards for Christmas Day | Gift your children a new gift on Christmas day This Christmas d...