Java Program to Test Using DFS Whether a Directed Graph is Strongly Connected or Not

This is a java program to test whether a directed graph is strongly connected or not. The graph is strongly connected if it has only one connected component.

Here is the source code of the Java Program to Test Using DFS Whether a Directed Graph is Strongly Connected or Not. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.

package com.maixuanviet.graph;
 
import java.util.*;
 
public class StronglyConnectedGraph
{
    private int                 V;
    private int                 preCount;
    private int[]               low;
    private boolean[]           visited;
    private List<Integer>[]     graph;
    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);
    }
 
    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        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>();
        /** accept all edges **/
        System.out.println("Enter number of edges");
        int E = scan.nextInt();
        /** all edges **/
        System.out.println("Enter the edges in the graph : <from> <to>");
        for (int i = 0; i < E; i++)
        {
            int x = scan.nextInt();
            int y = scan.nextInt();
            g[x].add(y);
        }
        StronglyConnectedGraph t = new StronglyConnectedGraph();
        System.out.print("The graph is strongly connected? : ");
        /** print all strongly connected components **/
        List<List<Integer>> scComponents = t.getSCComponents(g);
        Iterator<List<Integer>> iterator = scComponents.iterator();
        boolean stronglyConnected = true;
        while (iterator.hasNext())
        {
            if (iterator.next().size() <= 1)
            {
                stronglyConnected = false;
            }
        }
        System.out.println(stronglyConnected);
        scan.close();
    }
}

Output:

$ javac StronglyConnectedGraph.java
$ java StronglyConnectedGraph
 
Enter number of Vertices
6
Enter number of edges
7
Enter the edges in the graph : <from> <to>
0 1
1 2
1 3
3 4
4 5
5 3
5 2
The graph is strongly connected? : false
 
Enter number of Vertices
8
Enter number of edges
14
Enter the edges in the graph : <from> <to>
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
The graph is strongly connected? : true

Related posts:

Java Program to Implement the RSA Algorithm
Java 9 Stream API Improvements
Lập trình đa luồng với Callable và Future trong Java
REST Web service: Upload và Download file với Jersey 2.x
Java 8 – Powerful Comparison with Lambdas
Java Program to Generate Random Partition out of a Given Set of Numbers or Characters
How to Use if/else Logic in Java 8 Streams
How to Replace Many if Statements in Java
Guide to Dynamic Tests in Junit 5
Java Program to Implement Suffix Tree
How to Return 404 with Spring WebFlux
Jackson – Change Name of Field
Java Program to Use Boruvka’s Algorithm to Find the Minimum Spanning Tree
Reactive WebSockets with Spring 5
Allow user:password in URL
Giới thiệu Google Guice – Dependency injection (DI) framework
Java Program to Perform Left Rotation on a Binary Search Tree
Vấn đề Nhà sản xuất (Producer) – Người tiêu dùng (Consumer) và đồng bộ hóa các luồng trong Java
Assert an Exception is Thrown in JUnit 4 and 5
Request a Delivery / Read Receipt in Javamail
Jackson Ignore Properties on Marshalling
Java Program to Implement Multi-Threaded Version of Binary Search Tree
Remove All Occurrences of a Specific Value from a List
A Guide to Spring Boot Admin
Java Program to Perform Stooge Sort
Spring Cloud AWS – S3
Java Program to Find SSSP (Single Source Shortest Path) in DAG (Directed Acyclic Graphs)
Converting Iterator to List
Hướng dẫn Java Design Pattern – Visitor
Java Program to Implement Pairing Heap
Java Program to Check Whether it is Weakly Connected or Strongly Connected for a Directed Graph
Tạo ứng dụng Java RESTful Client với thư viện Retrofit