Java Program to Implement Tarjan Algorithm

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

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

/**
 *     Java Program to Implement Tarjan Algorithm
 **/
 
import java.util.*;
 
/** class Tarjan **/
class Tarjan
{
    /** number of vertices **/
    private int V;    
    /** preorder number counter **/
    private int preCount;
    /** low number of v **/
    private int[] low;
    /** to check if v is visited **/
    private boolean[] visited;      
    /** to store given graph **/
    private List<Integer>[] graph;
    /** to store all scc **/
    private List<List<Integer>> sccComp;
    private Stack<Integer> stack;
 
    /** function to get all strongly connected components **/
    public List<List<Integer>> getSCComponents(List<Integer>[] graph) 
    {
        V = graph.length;
        this.graph = graph;
        low = new int[V];
        visited = new boolean[V];
        stack = 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) 
    {
        low[v] = preCount++;
        visited[v] = true;
        stack.push(v);
        int min = low[v];
        for (int w : graph[v]) 
        {
            if (!visited[w])
                dfs(w);
            if (low[w] < min) 
                min = low[w];
        }
        if (min < low[v]) 
        { 
            low[v] = min; 
            return; 
        }        
        List<Integer> component = new ArrayList<Integer>();
        int w;
        do
        {
            w = stack.pop();
            component.add(w);
            low[w] = V;                
        } while (w != v);
        sccComp.add(component);        
    }    
    /** main **/
    public static void main(String[] args)
    {    
        Scanner scan = new Scanner(System.in);
        System.out.println("Tarjan 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);
        }
 
        Tarjan t = new Tarjan();        
        System.out.println("\nSCC : ");
        /** print all strongly connected components **/
        List<List<Integer>> scComponents = t.getSCComponents(g);
           System.out.println(scComponents);        
    }    
}
Tarjan 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:

Server-Sent Events in Spring
Java Program to Find Inverse of a Matrix
Guide To CompletableFuture
Java Program to Implement ArrayBlockingQueue API
Java Program to Evaluate an Expression using Stacks
Java Program to Implement Bubble Sort
Java Program to Find Shortest Path Between All Vertices Using Floyd-Warshall’s Algorithm
The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5
String Processing with Apache Commons Lang 3
Java Program to Implement Double Order Traversal of a Binary Tree
Java Program to Perform Quick Sort on Large Number of Elements
Custom HTTP Header with the HttpClient
Java Program to Compare Binary and Sequential Search
Java String Conversions
Testing in Spring Boot
Java 9 Stream API Improvements
Programmatic Transaction Management in Spring
The Spring @Controller and @RestController Annotations
Java 8 Streams peek() API
Introduction to Spring Cloud OpenFeign
Lớp lồng nhau trong java (Java inner class)
Giới thiệu Java Service Provider Interface (SPI) – Tạo các ứng dụng Java dễ mở rộng
Java Program to Implement LinkedBlockingDeque API
Spring MVC Content Negotiation
Java Program to Implement Merge Sort on n Numbers Without tail-recursion
Introduction to Spring Cloud Rest Client with Netflix Ribbon
Logging in Spring Boot
Use Liquibase to Safely Evolve Your Database Schema
Java Copy Constructor
Java Program to find the peak element of an array using Binary Search approach
Generate Spring Boot REST Client with Swagger
Guide to Apache Commons CircularFifoQueue