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:
Abstract class và Interface trong Java
“Stream has already been operated upon or closed” Exception in Java
Java Program to Implement Self organizing List
Spring WebClient Filters
Java Program to Implement the Bin Packing Algorithm
Java Program to Find Shortest Path Between All Vertices Using Floyd-Warshall’s Algorithm
Spring Boot - Web Socket
Java Program to do a Depth First Search/Traversal on a graph non-recursively
Tạo ứng dụng Java RESTful Client không sử dụng 3rd party libraries
Hướng dẫn Java Design Pattern – DAO
Java Program to Represent Graph Using Adjacency Matrix
Spring MVC Content Negotiation
Consuming RESTful Web Services
Spring Boot - Database Handling
How to Round a Number to N Decimal Places in Java
Autoboxing và Unboxing trong Java
Create Java Applet to Simulate Any Sorting Technique
Most commonly used String methods in Java
Guide to Java Instrumentation
Giới thiệu Aspect Oriented Programming (AOP)
Java – Get Random Item/Element From a List
Phương thức tham chiếu trong Java 8 – Method References
Java IO vs NIO
Filtering and Transforming Collections in Guava
A Guide to WatchService in Java NIO2
Java Program to Check whether Graph is a Bipartite using BFS
@DynamicUpdate with Spring Data JPA
Java – Generate Random String
Map Serialization and Deserialization with Jackson
Extract network card address
Guide to Guava Table
The DAO with JPA and Spring