This Java program, displays the Strong Connected Components of graph.A directed graph is called strongly connected if there is a path from each vertex in the graph to every other vertex. In particular , this means paths in each direction; a path from a to b and also a path from b to a.
Here is the source code of the Java program to display the Strong Connected Components of a graph. The Java program is successfully compiled and run on a Linux system. The program output is also shown below.
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
public class StrongConnectedComponents
{
private int leader = 0;
private int[] leader_node;
private int explore[];
private int finishing_time_of_node[];
private int finishing_time = 1;
private int number_of_nodes;
private Stack<Integer> stack;
private Map<Integer, Integer> finishing_time_map;
public StrongConnectedComponents(int number_of_nodes)
{
this.number_of_nodes = number_of_nodes;
leader_node = new int[number_of_nodes + 1];
explore = new int[number_of_nodes + 1];
finishing_time_of_node = new int[number_of_nodes + 1];
stack = new Stack<Integer>();
finishing_time_map = new HashMap<Integer, Integer>();
}
public void strongConnectedComponent(int adjacency_matrix[][])
{
for (int i = number_of_nodes; i > 0; i--)
{
if (explore[i] == 0)
{
dfs_1(adjacency_matrix, i);
}
}
int rev_matrix[][] = new int[number_of_nodes + 1][number_of_nodes + 1];
for (int i = 1; i <= number_of_nodes; i++)
{
for (int j = 1; j <= number_of_nodes; j++)
{
if (adjacency_matrix[i][j] == 1)
rev_matrix[finishing_time_of_node[j]][finishing_time_of_node[i]] = adjacency_matrix[i][j];
}
}
for (int i = 1; i <= number_of_nodes; i++)
{
explore[i] = 0;
leader_node[i] = 0;
}
for (int i = number_of_nodes; i > 0; i--)
{
if (explore[i] == 0)
{
leader = i;
dfs_2(rev_matrix, i);
}
}
}
public void dfs_1(int adjacency_matrix[][], int source)
{
explore = 1;
stack.push(source);
int i = 1;
int element = source;
while (!stack.isEmpty())
{
element = stack.peek();
i = 1;
while (i <= number_of_nodes)
{
if (adjacency_matrix[element][i] == 1 && explore[i] == 0)
{
stack.push(i);
explore[i] = 1;
element = i;
i = 1;
continue;
}
i++;
}
int poped = stack.pop();
int time = finishing_time++;
finishing_time_of_node[poped] = time;
finishing_time_map.put(time, poped);
}
}
public void dfs_2(int rev_matrix[][], int source)
{
explore = 1;
leader_node[finishing_time_map.get(source)] = leader;
stack.push(source);
int i = 1;
int element = source;
while (!stack.isEmpty())
{
element = stack.peek();
i = 1;
while (i <= number_of_nodes)
{
if (rev_matrix[element][i] == 1 && explore[i] == 0)
{
if (leader_node[finishing_time_map.get(i)] == 0)
leader_node[finishing_time_map.get(i)] = leader;
stack.push(i);
explore[i] = 1;
element = i;
i = 1;
continue;
}
i++;
}
stack.pop();
}
}
public static void main(String... arg)
{
int number_of_nodes;
Scanner scanner = null;
try
{
System.out.println("Enter the number of nodes in the graph");
scanner = new Scanner(System.in);
number_of_nodes = scanner.nextInt();
int adjacency_matrix[][] = new int[number_of_nodes + 1][number_of_nodes + 1];
System.out.println("Enter the adjacency matrix");
for (int i = 1; i <= number_of_nodes; i++)
for (int j = 1; j <= number_of_nodes; j++)
adjacency_matrix[i][j] = scanner.nextInt();
StrongConnectedComponents strong = new StrongConnectedComponents(number_of_nodes);
strong.strongConnectedComponent(adjacency_matrix);
System.out.println("The Strong Connected Components are");
for (int i = 1; i < strong.leader_node.length; i++)
{
System.out.println( "Node " + i+ "belongs to SCC"
+ strong.finishing_time_map.get(strong.leader_node[i]));
}
} catch (InputMismatchException inputMismatch)
{
System.out.println("Wrong Input Format");
}
}
}
$javac StrongConnectedComponents.java $java StrongConnectedComponenets Enter the number of nodes in the graph 8 Enter the adjacency matrix 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 The Strong Connected Components are Node 1 belongs to SCC 2 Node 2 belongs to SCC 2 Node 3 belongs to SCC 8 Node 4 belongs to SCC 4 Node 5 belongs to SCC 8 Node 6 belongs to SCC 2 Node 7 belongs to SCC 2 Node 8 belongs to SCC 8
Related posts:
Practical Java Examples of the Big O Notation
Java Program to Implement Network Flow Problem
Java Program to Implement IdentityHashMap API
Testing an OAuth Secured API with Spring MVC
The DAO with Spring and Hibernate
Java Program to Perform the Sorting Using Counting Sort
Java Program to Describe the Representation of Graph using Incidence List
Reactive Flow with MongoDB, Kotlin, and Spring WebFlux
Java Program to Perform String Matching Using String Library
String Joiner trong Java 8
Spring Cloud Series – The Gateway Pattern
A Guide to Java HashMap
HttpAsyncClient Tutorial
HTTP Authentification and CGI/Servlet
Spring Data – CrudRepository save() Method
Java Program to Implement ConcurrentSkipListMap API
Kiểu dữ liệu Ngày Giờ (Date Time) trong java
Java Program to Implement Hash Tables with Linear Probing
An Intro to Spring Cloud Contract
Jackson – JsonMappingException (No serializer found for class)
Tạo ứng dụng Java RESTful Client với thư viện Retrofit
Configure a RestTemplate with RestTemplateBuilder
Adding a Newline Character to a String in Java
Quick Guide to Spring MVC with Velocity
Display Auto-Configuration Report in Spring Boot
Java Program to Find SSSP (Single Source Shortest Path) in DAG (Directed Acyclic Graphs)
Java Program to Implement Repeated Squaring Algorithm
Uploading MultipartFile with Spring RestTemplate
Spring Cloud – Bootstrapping
Hướng dẫn Java Design Pattern – Visitor
Converting String to Stream of chars
How to Replace Many if Statements in Java