Java Program to Find a Clique by Using the Technique of the Most Dense Subgraph
Last Updated :
24 Dec, 2022
A clique is a subset of vertices of a graph such that every two distinct vertices in the clique are adjacent. Finding a clique from a graph is an important problem in graph theory and many algorithms have been proposed to solve this problem. The most popular algorithm for finding a clique is the technique of the most dense subgraph. This technique is based on the fact that a clique is the most dense subgraph of the graph. In this article, we will discuss a Java program to find a clique by using the technique of the most dense subgraph.
Examples
Example 1:
Let’s take a graph G = (V, E) with the following adjacency matrix:
V = {v1, v2, v3, v4}
E = {(v1, v2), (v2, v3), (v3, v4), (v1, v4)}
Adjacency Matrix:
[[0, 1, 0, 1],
[1, 0, 1, 0],
[0, 1, 0, 1],
[1, 0, 1, 0]]
The most dense subgraph of the graph G is the clique {v1, v2, v3, v4}.
Example 2:
Let’s take another graph G = (V, E) with the following adjacency matrix:
V = {v1, v2, v3, v4, v5}
E = {(v1, v2), (v2, v3), (v3, v4), (v4, v5), (v1, v5)}
Adjacency Matrix:
[[0, 1, 0, 0, 1],
[1, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 1],
[1, 0, 0, 1, 0]]
The most dense subgraph of the graph G is the clique {v1, v2, v3, v4}.
Approach
The approach used in the program is based on the technique of the most dense subgraph. The algorithm works as follows:
- Initialize an array of size equal to the number of vertices in the graph.
- For each vertex, count the number of edges connected to it.
- Find the vertex with the maximum number of edges and mark it as the first vertex of the clique.
- For each of the remaining vertices in the graph, count the number of edges connected to both the first vertex and the current vertex.
- If the number of edges is equal to the number of vertices in the clique, then add the current vertex to the clique.
- Repeat Steps 4 and 5 until all the vertices have been checked.
Below is the implementation of the above approach.
Implementation
Java
import java.util.ArrayList;
import java.util.List;
public class CliqueFinder {
static int [][] adjMatrix;
static int cliqueSize;
static List<Integer> clique;
static void init( int [][] adjMatrix)
{
clique = new ArrayList<Integer>();
for ( int i = 0 ; i < adjMatrix.length; i++) {
int count = 0 ;
for ( int j = 0 ; j < adjMatrix.length; j++) {
if (adjMatrix[i][j] == 1 )
count++;
}
if (count > cliqueSize) {
cliqueSize = count;
clique.clear();
clique.add(i);
}
}
}
static void findClique( int [][] adjMatrix)
{
for ( int i = 0 ; i < adjMatrix.length; i++) {
if (!clique.contains(i)) {
int count = 0 ;
for ( int j = 0 ; j < clique.size(); j++) {
if (adjMatrix[i][clique.get(j)] == 1 )
count++;
}
if (count == cliqueSize) {
clique.add(i);
}
}
}
}
public static void main(String[] args)
{
int [][] adjMatrix = { { 0 , 1 , 0 , 1 },
{ 1 , 0 , 1 , 0 },
{ 0 , 1 , 0 , 1 },
{ 1 , 0 , 1 , 0 } };
init(adjMatrix);
findClique(adjMatrix);
System.out.println( "The clique is: " );
for ( int i = 0 ; i < clique.size(); i++) {
System.out.print(clique.get(i) + " " );
}
}
}
|
Share your thoughts in the comments
Please Login to comment...