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:
Java – Random Long, Float, Integer and Double
Java Program to Check if a Directed Graph is a Tree or Not Using DFS
StringBuilder vs StringBuffer in Java
Generate Spring Boot REST Client with Swagger
Java Program to Print the Kind of Rotation the AVL Tree is Undergoing
Spring Cloud Series – The Gateway Pattern
Guide to Character Encoding
Spring Boot - Rest Controller Unit Test
Java Program to Implement Knight’s Tour Problem
Spring Boot Application as a Service
Java Program to Implement Sorted Array
How to Delay Code Execution in Java
Map Interface trong java
Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC
Performance Difference Between save() and saveAll() in Spring Data
Hướng dẫn Java Design Pattern – Command
Java Program to Implement Ternary Search Algorithm
Java Program to Implement Rope
Java String to InputStream
The Spring @Controller and @RestController Annotations
Java – Write an InputStream to a File
Hướng dẫn Java Design Pattern – Decorator
Java Program to Compute Discrete Fourier Transform Using Naive Approach
Queue và PriorityQueue trong Java
A Guide to BitSet in Java
Encode/Decode to/from Base64
Spring Boot with Multiple SQL Import Files
Java Program to Implement Hash Tables Chaining with Doubly Linked Lists
Java Scanner hasNext() vs. hasNextLine()
Hướng dẫn Java Design Pattern – Service Locator
Java List UnsupportedOperationException
Java Program to Perform Polygon Containment Test