Java Program to Implement Kosaraju Algorithm

This is a Java Program to Implement Kosaraju Algorithm. Kosaraju’s algorithm is a linear time algorithm to find the strongly connected components of a directed graph.

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

/**
 ** Java Program to Implement Kosaraju Algorithm
 **/
 
import java.util.*;
 
/** class Kosaraju **/
public class Kosaraju
{
    /** DFS function **/
    public void DFS(List<Integer>[] graph, int v, boolean[] visited, List<Integer> comp) 
    {
        visited[v] = true;
        for (int i = 0; i < graph[v].size(); i++)
            if (!visited[graph[v].get(i)])
                DFS(graph, graph[v].get(i), visited, comp);
        comp.add(v);
    }
    /** function fill order **/
    public List<Integer> fillOrder(List<Integer>[] graph, boolean[] visited) 
    {        
        int V = graph.length;
        List<Integer> order = new ArrayList<Integer>();
 
        for (int i = 0; i < V; i++)
            if (!visited[i])
                DFS(graph, i, visited, order);
        return order;
    }
    /** function to get transpose of graph **/
    public List<Integer>[] getTranspose(List<Integer>[] graph)
    {
        int V = graph.length;
        List<Integer>[] g = new List[V];
        for (int i = 0; i < V; i++)
            g[i] = new ArrayList<Integer>();
        for (int v = 0; v < V; v++)
            for (int i = 0; i < graph[v].size(); i++)
                g[graph[v].get(i)].add(v);
        return g;
    }
    /** function to get all SCC **/
    public List<List<Integer>> getSCComponents(List<Integer>[] graph)
    {
        int V = graph.length;
        boolean[] visited = new boolean[V];
        List<Integer> order = fillOrder(graph, visited);       
        /** get transpose of the graph **/
        List<Integer>[] reverseGraph = getTranspose(graph);        
        /** clear visited array **/
        visited = new boolean[V];
        /** reverse order or alternatively use a stack for order **/
        Collections.reverse(order);
 
        /** get all scc **/
        List<List<Integer>> SCComp = new ArrayList<>();
        for (int i = 0; i < order.size(); i++)
        {
            /** if stack is used for order pop out elements **/
            int v = order.get(i);
            if (!visited[v]) 
            {
                List<Integer> comp = new ArrayList<>();
                DFS(reverseGraph, v, visited, comp);
                SCComp.add(comp);
            }
        }
        return SCComp;
    }
    /** main **/
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Kosaraju algorithm Test\n");
        Kosaraju k = new Kosaraju();
 
        System.out.println("Enter number of Vertices");
        /** number of vertices **/
        int V = scan.nextInt();
        List<Integer>[] g = new List[V];
        for (int i = 0; i < V; i++)
            g[i] = new ArrayList<Integer>();
 
        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();
            /** add edge **/
            g[x].add(y);
        }
        System.out.println("\nSCC : ");
        /** print all strongly connected components **/
        List<List<Integer>> scComponents = k.getSCComponents(g);
        System.out.println(scComponents);    
    }    
}
Kosaraju 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 :
[[1, 4, 0], [7, 3, 2], [5, 6]]

Related posts:

Java Program to Implement PrinterStateReasons API
Logout in an OAuth Secured Application
Tạo ứng dụng Java RESTful Client với thư viện OkHttp
Java Program to Implement Quick Sort with Given Complexity Constraint
Handling Errors in Spring WebFlux
Spring Boot - Internationalization
Wrapper Classes in Java
Java Program to Apply Above-Below-on Test to Find the Position of a Point with respect to a Line
Tránh lỗi ConcurrentModificationException trong Java như thế nào?
Java Program to Implement Insertion Sort
Intro to Spring Boot Starters
Java Program to Check Whether a Directed Graph Contains a Eulerian Path
Runnable vs. Callable in Java
Spring Boot - Cloud Configuration Client
Phương thức tham chiếu trong Java 8 – Method References
Từ khóa this và super trong Java
Display Auto-Configuration Report in Spring Boot
An Intro to Spring Cloud Security
Java Program to Check Whether an Input Binary Tree is the Sub Tree of the Binary Tree
4 tính chất của lập trình hướng đối tượng trong Java
Java Program to Implement PriorityBlockingQueue API
Java Program to find the maximum subarray sum O(n^2) time(naive method)
Hướng dẫn Java Design Pattern – Prototype
Java Program to Implement Queue using Linked List
Basic Authentication with the RestTemplate
Java Program to Check the Connectivity of Graph Using DFS
Java Program to Implement Knight’s Tour Problem
Spring Boot - Rest Controller Unit Test
Hướng dẫn Java Design Pattern – MVC
Java Program to add two large numbers using Linked List
Java Program to Solve Tower of Hanoi Problem using Stacks
Java Program to Implement Adjacency Matrix