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 Program to Implement Borwein Algorithm
HttpClient Timeout
Java Program to Solve the Fractional Knapsack Problem
Java Program to Implement Lloyd’s Algorithm
Xây dựng ứng dụng Client-Server với Socket trong Java
Tính trừu tượng (Abstraction) trong Java
Spring JDBC
Functional Interfaces in Java 8
Spring Boot - Twilio
String Processing with Apache Commons Lang 3
Mệnh đề Switch-case trong java
Java Program to Implement CountMinSketch
How to Find an Element in a List with Java
Java – Random Long, Float, Integer and Double
Java Program to Implement Sorted Singly Linked List
Predicate trong Java 8
Posting with HttpClient
Java Program to Check Whether an Undirected Graph Contains a Eulerian Cycle
Java Program to Implement Graph Coloring Algorithm
Spring Security Logout
Guide to DelayQueue
Derived Query Methods in Spring Data JPA Repositories
The HttpMediaTypeNotAcceptableException in Spring MVC
Luồng Daemon (Daemon Thread) trong Java
Java Program to Perform Searching Using Self-Organizing Lists
Converting between an Array and a List in Java
Comparing Arrays in Java
Java – InputStream to Reader
Giới thiệu Design Patterns
Java Program to Implement Control Table
Java Program to Implement Warshall Algorithm
Notify User of Login From New Device or Location