Find if an undirected graph contains an independent set of a given size - GeeksforGeeks

07 Apr, 2022
Given an undirected graph, check if it contains an independent set of size k. Print ‘Yes’ if there exists an independent set of size k. Print ‘No’ otherwise.
Independent Set: An independent set in a graph is a set of vertices that are not directly connected to each other.
Example 1: 
Input : K = 4,
        graph = [[1, 1, 0, 0, 0],
                 [1, 1, 1, 1, 1],
                 [0, 1, 1, 0, 0],
                 [0, 1, 0, 1, 0],
                 [0, 1, 0, 0, 1]]
Output : Yes 
The above graph contains an independent set of size 4 (vertices 1, 2, 3, 4 are not directly connected to each other). Hence, the output is ‘Yes’.
Example 2: 
Input : K = 4,
        graph = [[1, 1, 0, 0, 0],
                 [1, 1, 1, 1, 1],
                 [0, 1, 1, 0, 0],
                 [0, 1, 0, 1, 1],
                 [0, 1, 0, 1, 1]]
Output : No
The above graph doesn’t contain an independent set of size 4. Hence, the output is ‘No’. 
Approach:  
Initialize a variable sol with boolean False value.
Find all the possible sets of vertices of size K from the given graph.
If an independent set of size k is found, change the value of sol to True and return.
Else continue checking for other possible sets.
In the end, if sol is True, print ‘Yes’ else print ‘No’.
Below is the implementation of the above approach: 
C++14
Java
Python3
C#
Javascript
// C++ code to check if a given graph// contains an independent set of size k#include <bits/stdc++.h>using namespace std; // Function prototypebool check(int[][5], vector<int> &, int); // Function to construct a set of given size kbool func(int graph[][5], vector<int> &arr,          int k, int index, bool sol[]){    // Check if the selected set is independent or not.    // Change the value of sol to True and return    // if it is independent    if (k == 0)    {        if (check(graph, arr, arr.size()))        {            sol[0] = true;            return true;        }    }    else    {        // Set of size k can be formed even if we don't        // include the vertex at current index.        if (index >= k)        {            vector<int> newvec(arr.begin(), arr.end());            newvec.push_back(index);            return (func(graph, newvec, k - 1,                                index - 1, sol) or                    func(graph, arr, k, index - 1, sol));        }         // Set of size k cannot be formed if we don't        // include the vertex at current index.        else        {            arr.push_back(index);            return func(graph, arr, k - 1,                          index - 1, sol);        }    }} // Function to check if the given set is// independent or not// arr --> set of size k (contains the// index of included vertex)bool check(int graph[][5], vector<int> &arr, int n){    // Check if each vertex is connected to any other    // vertex in the set or not    for (int i = 0; i < n; i++)        for (int j = i + 1; j < n; j++)            if (graph[arr[i]][arr[j]] == 1)                return false;    return true;} // Driver Codeint main(){    int graph[][5] = {{1, 1, 0, 0, 0},                      {1, 1, 1, 1, 1},                      {0, 1, 1, 0, 0},                      {0, 1, 0, 1, 0},                      {0, 1, 0, 0, 1}};    int k = 4;    vector<int> arr; // Empty set    bool sol[] = {false};    int n = sizeof(graph) /            sizeof(graph[0]);    func(graph, arr, k, n - 1, sol);     if (sol[0])        cout << "Yes" << endl;    else        cout << "No" << endl;    return 0;} // This code is contributed by// sanjeev2552
// Java code to check if a// given graph contains an// independent set of size kimport java.util.*;class GFG{ static  Vector<Integer> arr =        new Vector<>(); // Function to cona set of// given size kstatic boolean func(int graph[][],                    int k, int index,                    boolean sol[]){  // Check if the selected set is  // independent or not. Change the  // value of sol to True and return  // if it is independent  if (k == 0)  {    if (check(graph,              arr.size()))    {      sol[0] = true;      return true;    }  }  else  {    // Set of size k can be    // formed even if we don't    // include the vertex at    // current index.    if (index >= k)    {      Vector<Integer> newvec =             new Vector<>();      newvec.add(index);      return (func(graph, k - 1,                   index - 1, sol) ||              func(graph, k,                   index - 1, sol));    }     // Set of size k cannot be    // formed if we don't include    // the vertex at current index.    else    {      arr.add(index);      return func(graph, k - 1,                  index - 1, sol);    }  }  return true;} // Function to check if the// given set is independent// or not arr -. set of size// k (contains the index of// included vertex)static boolean check(int graph[][],                     int n){  // Check if each vertex is  // connected to any other  // vertex in the set or not  for (int i = 0; i < n; i++)    for (int j = i + 1; j < n; j++)      if (graph[arr.get(i)][arr.get(j)] == 1)        return false;  return true;} // Driver Codepublic static void main(String[] args){  int graph[][] = {{1, 1, 0, 0, 0},                   {1, 1, 1, 1, 1},                   {0, 1, 1, 0, 0},                   {0, 1, 0, 1, 0},                   {0, 1, 0, 0, 1}};  int k = 4;  boolean []sol = new boolean[1];  int n = graph.length;  func(graph, k, n - 1, sol);   if (sol[0])    System.out.print("Yes" + "\n");  else    System.out.print("No" + "\n");}} // This code is contributed by Amit Katiyar
# Python3 code to check if a given graph# contains an independent set of size k # Function to construct a set of given size kdef func(graph, arr, k, index, sol):         # Check if the selected set is independent or not.    # Change the value of sol to True and return    # if it is independent    if k == 0:        if check(graph, arr) == True:            sol[0] = True            return             else:        # Set of size k can be formed even if we don't        # include the vertex at current index.        if index >= k:            return (func(graph, arr[:] + [index], k-1, index-1, sol) or                    func(graph, arr[:], k, index-1, sol))                 # Set of size k cannot be formed if we don't        # include the vertex at current index.        else:            return func(graph, arr[:] + [index], k-1, index-1, sol) # Function to check if the given set is# independent or not# arr --> set of size k (contains the# index of included vertex)def check(graph, arr):         # Check if each vertex is connected to any other    # vertex in the set or not    for i in range(len(arr)):        for j in range(i + 1, len(arr)):                         if graph[arr[i]][arr[j]] == 1:                return False                     return True # Driver Code   graph = [[1, 1, 0, 0, 0],         [1, 1, 1, 1, 1],         [0, 1, 1, 0, 0],         [0, 1, 0, 1, 0],         [0, 1, 0, 0, 1]]         k = 4arr = []     # Empty setsol = [False] func(graph, arr[:], k, len(graph)-1, sol) if sol[0] == True:    print("Yes")else:    print("No")
// C# code to check if a// given graph contains an// independent set of size kusing System;using System.Collections.Generic; class GFG{ static List<int> arr = new List<int>(); // Function to cona set of// given size kstatic bool func(int [,]graph,                 int k, int index,                 bool []sol){     // Check if the selected set is  // independent or not. Change the  // value of sol to True and return  // if it is independent  if (k == 0)  {    if (check(graph,              arr.Count))    {      sol[0] = true;      return true;    }  }  else  {         // Set of size k can be    // formed even if we don't    // include the vertex at    // current index.    if (index >= k)    {      List<int> newvec = new List<int>();      newvec.Add(index);             return (func(graph, k - 1,                       index - 1, sol) ||              func(graph, k,                   index - 1, sol));    }         // Set of size k cannot be    // formed if we don't include    // the vertex at current index.    else    {      arr.Add(index);             return func(graph, k - 1,                     index - 1, sol);    }  }  return true;} // Function to check if the// given set is independent// or not arr -. set of size// k (contains the index of// included vertex)static bool check(int [,]graph, int n){     // Check if each vertex is  // connected to any other  // vertex in the set or not  for(int i = 0; i < n; i++)    for(int j = i + 1; j < n; j++)      if (graph[arr[i],arr[j]] == 1)        return false;     return true;} // Driver Codepublic static void Main(String[] args){  int [,]graph = { { 1, 1, 0, 0, 0 },                   { 1, 1, 1, 1, 1 },                   { 0, 1, 1, 0, 0 },                   { 0, 1, 0, 1, 0 },                   { 0, 1, 0, 0, 1 } };  int k = 4;  bool []sol = new bool[1];  int n = graph.GetLength(0);     func(graph, k, n - 1, sol);   if (sol[0])    Console.Write("Yes" + "\n");  else    Console.Write("No" + "\n");}} // This code is contributed by Amit Katiyar
<script> // JavaScript implementation of the above approach // Function to construct a set of given size kfunction func(graph, arr,k, index, sol){    // Check if the selected set is independent or not.    // Change the value of sol to True and return    // if it is independent    if (k == 0)    {        if (check(graph, arr, arr.length))        {            sol[0] = true;            return true;        }    }    else    {        // Set of size k can be formed even if we don't        // include the vertex at current index.        if (index >= k)        {            let newvec = new Array();            for(let x of arr){                newvec.push(x);            }            newvec.push(index);            return (func(graph, newvec, k - 1,index - 1, sol) || func(graph, arr, k, index - 1, sol));        }         // Set of size k cannot be formed if we don't        // include the vertex at current index.        else        {            arr.push(index);            return func(graph, arr, k - 1,index - 1, sol);        }    }} // Function to check if the given set is// independent or not// arr --> set of size k (contains the// index of included vertex)function check(graph,arr,n){    // Check if each vertex is connected to any other    // vertex in the set or not    for (let i = 0; i < n; i++)        for (let j = i + 1; j < n; j++)            if (graph[arr[i]][arr[j]] == 1)                return false;    return true;} // Driver Codelet graph = [[1, 1, 0, 0, 0],                    [1, 1, 1, 1, 1],                    [0, 1, 1, 0, 0],                    [0, 1, 0, 1, 0],                    [0, 1, 0, 0, 1]];let k = 4;let arr = []; // Empty setlet sol = [false];let n = graph.length;func(graph, arr, k, n - 1, sol); if (sol[0])     document.write("Yes");else     document.write("No"); // This code is written by Shinjanpatra </script>
Yes
 
Time Complexity: where V is the number of vertices in the graph and k is the given size of set. Auxiliary Space: O(V)  
sanjeev2552
amit143katiyar
pankajsharmagfg
shinjanpatra
Picked
Technical Scripter 2018
Algorithms
Graph
Technical Scripter
Graph
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
How to write a Pseudo Code?
Understanding Time Complexity with Simple Examples
Introduction to Algorithms
Breadth First Search or BFS for a Graph
Depth First Search or DFS for a Graph
Graph and its representations
Topological Sorting
Bellman–Ford Algorithm | DP-23