# Maximal Independent Set in an Undirected Graph

• Last Updated : 13 Jul, 2020

Given an undirected graph defined by the number of vertex V and the edges E[ ], the task is to find Maximal Independent Vertex Set in an undirected graph.

Independent Set: An independent set in a graph is a set of vertices which are not directly connected to each other.

Note: It is a given that there is at least one way to traverse from any vertex in the graph to another, i.e. the graph has one connected component.

Examples:

Input: V = 3, E = { (1, 2), (2, 3) }
Output: {1, 3}
Explanation:
Since there are no edges between 1 and 3, and we cannot add 2 to this since it is a neighbour of 1, this is the Maximal Independent Set.

Input: V = 8,
E = { (1, 2), (1, 3), (2, 4), (5, 6), (6, 7), (4, 8) }
Output: {2, 3, 5, 7, 8}

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

Approach:
This problem is an NP-Hard problem, which can only be solved in exponential time(as of right now).
Follow the steps below to solve the problem:

• Iterate through the vertices of the graph and use backtracking to check if a vertex can be included in the Maximal Independent Set or not.
• Two possibilities arise for each vertex, whether it can be included or not in the maximal independent set.
• Initially start, considering all vertices and edges. One by one, select a vertex. Remove that vertex from the graph, excluding it from the maximal independent set, and recursively traverse the remaining graph to find the maximal independent set.
• Otherwise, consider the selected vertex in the maximal independent set and remove all its neighbors from it. Proceed to find the maximal independent set possible excluding its neighbors.
• Repeat this process for all vertices and print the maximal independent set obtained.

Below is the implementation of the above approach:

## Python3

 `# Python Program to implement``# the above approach`` ` `# Recursive Function to find the``# Maximal Independent Vertex Set    ``def` `graphSets(graph):``     ` `    ``# Base Case - Given Graph ``    ``# has no nodes``    ``if``(``len``(graph) ``=``=` `0``):``        ``return` `[]``    ` `    ``# Base Case - Given Graph``    ``# has 1 node``    ``if``(``len``(graph) ``=``=` `1``):``        ``return` `[``list``(graph.keys())[``0``]]``     ` `    ``# Select a vertex from the graph``    ``vCurrent ``=` `list``(graph.keys())[``0``]``     ` `    ``# Case 1 - Proceed removing``    ``# the selected vertex``    ``# from the Maximal Set``    ``graph2 ``=` `dict``(graph)``     ` `    ``# Delete current vertex ``    ``# from the Graph``    ``del` `graph2[vCurrent]``     ` `    ``# Recursive call - Gets ``    ``# Maximal Set,``    ``# assuming current Vertex ``    ``# not selected``    ``res1 ``=` `graphSets(graph2)``     ` `    ``# Case 2 - Proceed considering``    ``# the selected vertex as part``    ``# of the Maximal Set`` ` `    ``# Loop through its neighbours``    ``for` `v ``in` `graph[vCurrent]:``         ` `        ``# Delete neighbor from ``        ``# the current subgraph``        ``if``(v ``in` `graph2):``            ``del` `graph2[v]``     ` `    ``# This result set contains VFirst,``    ``# and the result of recursive``    ``# call assuming neighbors of vFirst``    ``# are not selected``    ``res2 ``=` `[vCurrent] ``+` `graphSets(graph2)``     ` `    ``# Our final result is the one ``    ``# which is bigger, return it``    ``if``(``len``(res1) > ``len``(res2)):``        ``return` `res1``    ``return` `res2`` ` `# Driver Code``V ``=` `8`` ` `# Defines edges``E ``=` `[ (``1``, ``2``),``      ``(``1``, ``3``),``      ``(``2``, ``4``),``      ``(``5``, ``6``),``      ``(``6``, ``7``),``      ``(``4``, ``8``)]`` ` `graph ``=` `dict``([])`` ` `# Constructs Graph as a dictionary ``# of the following format-`` ` `# graph[VertexNumber V] ``# = list[Neighbors of Vertex V]``for` `i ``in` `range``(``len``(E)):``    ``v1, v2 ``=` `E[i]``     ` `    ``if``(v1 ``not` `in` `graph):``        ``graph[v1] ``=` `[]``    ``if``(v2 ``not` `in` `graph):``        ``graph[v2] ``=` `[]``     ` `    ``graph[v1].append(v2)``    ``graph[v2].append(v1)`` ` `# Recursive call considering ``# all vertices in the maximum ``# independent set``maximalIndependentSet ``=` `graphSets(graph)`` ` `# Prints the Result ``for` `i ``in` `maximalIndependentSet:``    ``print``(i, end ``=``" "``)`

Output:

```2 3 8 5 7
```

Time Complexity: O(2N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up