This Java program is to find number of articulation points in graph. A vertex in an undirected connected graph is an articulation point (or cut vertex) iff removing it (and edges through it) disconnects the graph. Articulation points represent vulnerabilities in a connected network – single points whose failure would split the network into 2 or more disconnected components.
Here is the source code of the Java program to find number of articulation points in graph. The Java program is successfully compiled and run on a Linux system. The program output is also shown below.
import java.util.HashSet;
import java.util.InputMismatchException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;
public class NumberOfArticulationPoints
{
private Stack<Integer> stack;
private int numberOfNodes;
private Set<Integer> articulationPoints;
private int[] parent;
private int[] visited;
private int[][] adjacencyMatrix;
public NumberOfArticulationPoints(int numberOfNodes)
{
this.numberOfNodes = numberOfNodes;
this.stack = new Stack<Integer>();
this.articulationPoints = new HashSet<Integer>();
this.parent = new int[numberOfNodes + 1];
this.visited = new int[numberOfNodes + 1];
this.adjacencyMatrix = new int[numberOfNodes + 1][numberOfNodes + 1];
}
public int numberOfArticulationPoint(int adjacencyMatrix[][], int source)
{
int children = 0;
int element, destination;
stack.push(source);
visited = 1;
for (int sourceVertex = 1; sourceVertex <= numberOfNodes; sourceVertex++)
{
for (int destinationVertex = 1; destinationVertex <= numberOfNodes; destinationVertex++)
{
this.adjacencyMatrix[sourceVertex][destinationVertex]
= adjacencyMatrix[sourceVertex][destinationVertex];
}
}
while (!stack.isEmpty())
{
element = stack.peek();
destination = element;
while (destination <= numberOfNodes)
{
if (this.adjacencyMatrix[element][destination] == 1 && visited[destination] == 0)
{
stack.push(destination);
visited[destination] = 1;
parent[destination] = element;
if (element == source)
{
children++;
}
if (!isLeaf(this.adjacencyMatrix, destination))
{
if (children > 1)
{
articulationPoints.add(source);
}
if (isArticulationPoint(this.adjacencyMatrix, destination))
{
articulationPoints.add(destination);
}
}
element = destination;
destination = 1;
continue;
}
destination++;
}
stack.pop();
}
return articulationPoints.size();
}
private boolean isArticulationPoint(int adjacencyMatrix[][], int root)
{
int explored[] = new int[numberOfNodes + 1];
Stack<Integer> stack = new Stack<Integer>();
stack.push(root);
int element = 0, destination = 0;
while (!stack.isEmpty())
{
element = stack.peek();
destination = 1;
while (destination <= numberOfNodes)
{
if ( element != root)
{
if (adjacencyMatrix[element][destination] == 1 && visited[destination] == 1)
{
if (this.stack.contains(destination))
{
if (destination <= parent[root])
{
return false;
}
return true;
}
}
}
if ((adjacencyMatrix[element][destination] == 1 && explored[destination] == 0 )
&& visited[destination] == 0)
{
stack.push(destination);
explored[destination] = 1;
adjacencyMatrix[destination][element] = 0;
element = destination;
destination = 1;
continue;
}
destination++;
}
stack.pop();
}
return true;
}
private boolean isLeaf(int adjacencyMatrix[][], int node)
{
boolean isLeaf = true;
for (int vertex = 1; vertex <= numberOfNodes; vertex++)
{
if (adjacencyMatrix[node][vertex] == 1 && visited[vertex] == 1)
{
isLeaf = true;
}else if (adjacencyMatrix[node][vertex] == 1 && visited[vertex] == 0)
{
isLeaf = false;
break;
}
}
return isLeaf;
}
public static void main(String... arg)
{
int number_of_nodes, source;
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();
System.out.println("Enter the source for the graph");
source = scanner.nextInt();
NumberOfArticulationPoints articulationPoints = new NumberOfArticulationPoints(number_of_nodes);
int num = articulationPoints.numberOfArticulationPoint(adjacency_matrix, source);
System.out.println("The number is " + num);
} catch (InputMismatchException inputMismatch)
{
System.out.println("Wrong Input format");
}
scanner.close();
}
}
$javac NumberOfArticulationPoints.java $java NumberOfArticulationPoints Enter the number of nodes in the graph 5 Enter the adjacency matrix 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 Enter the source for the graph 1 The Given Graph is BiConnected
Related posts:
Java Program to Implement Fisher-Yates Algorithm for Array Shuffling
Generating Random Numbers in a Range in Java
Comparing Objects in Java
REST Web service: Upload và Download file với Jersey 2.x
Java Program to Implement Gauss Jordan Elimination
Integer Constant Pool trong Java
Java Program to Implement Floyd Cycle Algorithm
Java String Conversions
Life Cycle of a Thread in Java
Java Program to do a Depth First Search/Traversal on a graph non-recursively
Overflow and Underflow in Java
So sánh ArrayList và LinkedList trong Java
Guide to Guava Multimap
Spring Boot: Customize Whitelabel Error Page
Spring @RequestMapping New Shortcut Annotations
Java Program to Find Minimum Element in an Array using Linear Search
Java Program to Implement Insertion Sort
Java Program to Implement Queue
Java Program to Implement Hash Tables Chaining with Binary Trees
Extra Login Fields with Spring Security
Java Program to Implement Sorted Array
Java Program to Implement Range Tree
Quick Guide to java.lang.System
Java Program to Implement Stack
Hướng dẫn sử dụng biểu thức chính quy (Regular Expression) trong Java
Sử dụng CountDownLatch trong Java
Rate Limiting in Spring Cloud Netflix Zuul
Spring Security Basic Authentication
Spring Boot - Cloud Configuration Client
Java Program to Implement Fibonacci Heap
Java Program to find the maximum subarray sum O(n^2) time(naive method)
Converting Strings to Enums in Java