Related Articles
Maximal Clique Problem | Recursive Solution
• Difficulty Level : Hard
• Last Updated : 29 Sep, 2020

Given a small graph with N nodes and E edges, the task is to find the maximum clique in the given graph. A clique is a complete subgraph of a given graph. This means that all nodes in the said subgraph are directly connected to each other, or there is an edge between any two nodes in the subgraph. The maximal clique is the complete subgraph of a given graph which contains the maximum number of nodes.

Examples:

Input: N = 4, edges[][] = {{1, 2}, {2, 3}, {3, 1}, {4, 3}, {4, 1}, {4, 2}}
Output: 4

Input: N = 5, edges[][] = {{1, 2}, {2, 3}, {3, 1}, {4, 3}, {4, 5}, {5, 3}}
Output: 3

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The idea is to use recursion to solve the problem.

• When an edge is added to the present list, check that if by adding that edge to the present list, does it still form a clique or not.
• The vertices are added until the list does not form a clique. Then, the list is backtracked to find a larger subset which forms a clique.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` ` `  `const` `int` `MAX = 100; ` ` `  `// Stores the vertices ` `int` `store[MAX], n; ` ` `  `// Graph ` `int` `graph[MAX][MAX]; ` ` `  `// Degree of the vertices ` `int` `d[MAX]; ` ` `  `// Function to check if the given set of ` `// vertices in store array is a clique or not ` `bool` `is_clique(``int` `b) ` `{ ` ` `  `    ``// Run a loop for all set of edges ` `    ``for` `(``int` `i = 1; i < b; i++) { ` `        ``for` `(``int` `j = i + 1; j < b; j++) ` ` `  `            ``// If any edge is missing ` `            ``if` `(graph[store[i]][store[j]] == 0) ` `                ``return` `false``; ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Function to find all the sizes ` `// of maximal cliques ` `int` `maxCliques(``int` `i, ``int` `l) ` `{ ` `    ``// Maximal clique size ` `    ``int` `max_ = 0; ` ` `  `    ``// Check if any vertices from i+1 ` `    ``// can be inserted ` `    ``for` `(``int` `j = i + 1; j <= n; j++) { ` ` `  `        ``// Add the vertex to store ` `        ``store[l] = j; ` ` `  `        ``// If the graph is not a clique of size k then ` `        ``// it cannot be a clique by adding another edge ` `        ``if` `(is_clique(l + 1)) { ` ` `  `            ``// Update max ` `            ``max_ = max(max_, l); ` ` `  `            ``// Check if another edge can be added ` `            ``max_ = max(max_, maxCliques(j, l + 1)); ` `        ``} ` `    ``} ` `    ``return` `max_; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `edges[][2] = { { 1, 2 }, { 2, 3 }, { 3, 1 },  ` `                       ``{ 4, 3 }, { 4, 1 }, { 4, 2 } }; ` `    ``int` `size = ``sizeof``(edges) / ``sizeof``(edges[0]); ` `    ``n = 4; ` ` `  `    ``for` `(``int` `i = 0; i < size; i++) { ` `        ``graph[edges[i][0]][edges[i][1]] = 1; ` `        ``graph[edges[i][1]][edges[i][0]] = 1; ` `        ``d[edges[i][0]]++; ` `        ``d[edges[i][1]]++; ` `    ``} ` ` `  `    ``cout << maxCliques(0, 1); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java implementation of the approach ` `import` `java.util.*; ` ` `  `class` `GFG ` `{ ` ` `  `static` `int` `MAX = ``100``, n; ` ` `  `// Stores the vertices ` `static` `int` `[]store = ``new` `int``[MAX]; ` ` `  `// Graph ` `static` `int` `[][]graph = ``new` `int``[MAX][MAX]; ` ` `  `// Degree of the vertices ` `static` `int` `[]d = ``new` `int``[MAX]; ` ` `  `// Function to check if the given set of ` `// vertices in store array is a clique or not ` `static` `boolean` `is_clique(``int` `b) ` `{ ` ` `  `    ``// Run a loop for all set of edges ` `    ``for` `(``int` `i = ``1``; i < b; i++) ` `    ``{ ` `        ``for` `(``int` `j = i + ``1``; j < b; j++) ` ` `  `            ``// If any edge is missing ` `            ``if` `(graph[store[i]][store[j]] == ``0``) ` `                ``return` `false``; ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Function to find all the sizes ` `// of maximal cliques ` `static` `int` `maxCliques(``int` `i, ``int` `l) ` `{ ` `    ``// Maximal clique size ` `    ``int` `max_ = ``0``; ` ` `  `    ``// Check if any vertices from i+1 ` `    ``// can be inserted ` `    ``for` `(``int` `j = i + ``1``; j <= n; j++)  ` `    ``{ ` ` `  `        ``// Add the vertex to store ` `        ``store[l] = j; ` ` `  `        ``// If the graph is not a clique of size k then ` `        ``// it cannot be a clique by adding another edge ` `        ``if` `(is_clique(l + ``1``)) ` `        ``{ ` ` `  `            ``// Update max ` `            ``max_ = Math.max(max_, l); ` ` `  `            ``// Check if another edge can be added ` `            ``max_ = Math.max(max_, maxCliques(j, l + ``1``)); ` `        ``} ` `    ``} ` `    ``return` `max_; ` `} ` ` `  `// Driver code ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``int` `[][]edges = { { ``1``, ``2` `}, { ``2``, ``3` `}, { ``3``, ``1` `},  ` `                    ``{ ``4``, ``3` `}, { ``4``, ``1` `}, { ``4``, ``2` `} }; ` `    ``int` `size = edges.length; ` `    ``n = ``4``; ` ` `  `    ``for` `(``int` `i = ``0``; i < size; i++) ` `    ``{ ` `        ``graph[edges[i][``0``]][edges[i][``1``]] = ``1``; ` `        ``graph[edges[i][``1``]][edges[i][``0``]] = ``1``; ` `        ``d[edges[i][``0``]]++; ` `        ``d[edges[i][``1``]]++; ` `    ``} ` `    ``System.out.print(maxCliques(``0``, ``1``)); ` `} ` `} ` ` `  `// This code is contributed by 29AjayKumar `

## Python3

 `# Python3 implementation of the approach ` `MAX` `=` `100``; ` `n ``=` `0``; ` ` `  `# Stores the vertices ` `store ``=` `[``0``] ``*` `MAX``; ` ` `  `# Graph ` `graph ``=` `[[``0` `for` `i ``in` `range``(``MAX``)] ``for` `j ``in` `range``(``MAX``)]; ` ` `  `# Degree of the vertices ` `d ``=` `[``0``] ``*` `MAX``; ` ` `  `# Function to check if the given set of ` `# vertices in store array is a clique or not ` `def` `is_clique(b): ` ` `  `    ``# Run a loop for all set of edges ` `    ``for` `i ``in` `range``(``1``, b): ` `        ``for` `j ``in` `range``(i ``+` `1``, b): ` ` `  `            ``# If any edge is missing ` `            ``if` `(graph[store[i]][store[j]] ``=``=` `0``): ` `                ``return` `False``; ` `     `  `    ``return` `True``; ` ` `  `# Function to find all the sizes ` `# of maximal cliques ` `def` `maxCliques(i, l): ` ` `  `    ``# Maximal clique size ` `    ``max_ ``=` `0``; ` ` `  `    ``# Check if any vertices from i+1 ` `    ``# can be inserted ` `    ``for` `j ``in` `range``(i ``+` `1``, n ``+` `1``): ` ` `  `        ``# Add the vertex to store ` `        ``store[l] ``=` `j; ` ` `  `        ``# If the graph is not a clique of size k then ` `        ``# it cannot be a clique by adding another edge ` `        ``if` `(is_clique(l ``+` `1``)): ` ` `  `            ``# Update max ` `            ``max_ ``=` `max``(max_, l); ` ` `  `            ``# Check if another edge can be added ` `            ``max_ ``=` `max``(max_, maxCliques(j, l ``+` `1``)); ` `         `  `    ``return` `max_; ` `     `  `# Driver code ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``edges ``=` `[[ ``1``, ``2` `],[ ``2``, ``3` `],[ ``3``, ``1` `], ` `           ``[ ``4``, ``3` `],[ ``4``, ``1` `],[ ``4``, ``2` `]]; ` `    ``size ``=` `len``(edges); ` `    ``n ``=` `4``; ` ` `  `    ``for` `i ``in` `range``(size): ` `        ``graph[edges[i][``0``]][edges[i][``1``]] ``=` `1``; ` `        ``graph[edges[i][``1``]][edges[i][``0``]] ``=` `1``; ` `        ``d[edges[i][``0``]] ``+``=` `1``; ` `        ``d[edges[i][``1``]] ``+``=` `1``; ` `     `  `    ``print``(maxCliques(``0``, ``1``)); ` ` `  `# This code is contributed by PrinciRaj1992 `

## C#

 `// C# implementation of the approach ` `using` `System; ` ` `  `class` `GFG ` `{ ` ` `  `static` `int` `MAX = 100, n; ` ` `  `// Stores the vertices ` `static` `int` `[]store = ``new` `int``[MAX]; ` ` `  `// Graph ` `static` `int` `[,]graph = ``new` `int``[MAX,MAX]; ` ` `  `// Degree of the vertices ` `static` `int` `[]d = ``new` `int``[MAX]; ` ` `  `// Function to check if the given set of ` `// vertices in store array is a clique or not ` `static` `bool` `is_clique(``int` `b) ` `{ ` ` `  `    ``// Run a loop for all set of edges ` `    ``for` `(``int` `i = 1; i < b; i++) ` `    ``{ ` `        ``for` `(``int` `j = i + 1; j < b; j++) ` ` `  `            ``// If any edge is missing ` `            ``if` `(graph[store[i],store[j]] == 0) ` `                ``return` `false``; ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Function to find all the sizes ` `// of maximal cliques ` `static` `int` `maxCliques(``int` `i, ``int` `l) ` `{ ` `    ``// Maximal clique size ` `    ``int` `max_ = 0; ` ` `  `    ``// Check if any vertices from i+1 ` `    ``// can be inserted ` `    ``for` `(``int` `j = i + 1; j <= n; j++)  ` `    ``{ ` ` `  `        ``// Add the vertex to store ` `        ``store[l] = j; ` ` `  `        ``// If the graph is not a clique of size k then ` `        ``// it cannot be a clique by adding another edge ` `        ``if` `(is_clique(l + 1)) ` `        ``{ ` ` `  `            ``// Update max ` `            ``max_ = Math.Max(max_, l); ` ` `  `            ``// Check if another edge can be added ` `            ``max_ = Math.Max(max_, maxCliques(j, l + 1)); ` `        ``} ` `    ``} ` `    ``return` `max_; ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main(String[] args) ` `{ ` `    ``int` `[,]edges = { { 1, 2 }, { 2, 3 }, { 3, 1 },  ` `                    ``{ 4, 3 }, { 4, 1 }, { 4, 2 } }; ` `    ``int` `size = edges.GetLength(0); ` `    ``n = 4; ` ` `  `    ``for` `(``int` `i = 0; i < size; i++) ` `    ``{ ` `        ``graph[edges[i, 0], edges[i, 1]] = 1; ` `        ``graph[edges[i, 1], edges[i, 0]] = 1; ` `        ``d[edges[i, 0]]++; ` `        ``d[edges[i, 1]]++; ` `    ``} ` `    ``Console.Write(maxCliques(0, 1)); ` `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

Output:

```4
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :