# Maximal Clique Problem | Recursive Solution

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. 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[] = { { 1, 2 }, { 2, 3 }, { 3, 1 },  ` `                       ``{ 4, 3 }, { 4, 1 }, { 4, 2 } }; ` `    ``int` `size = ``sizeof``(edges) / ``sizeof``(edges); ` `    ``n = 4; ` ` `  `    ``for` `(``int` `i = 0; i < size; i++) { ` `        ``graph[edges[i]][edges[i]] = 1; ` `        ``graph[edges[i]][edges[i]] = 1; ` `        ``d[edges[i]]++; ` `        ``d[edges[i]]++; ` `    ``} ` ` `  `    ``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
```

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : 29AjayKumar, princiraj1992