# Find two disjoint good sets of vertices in a given graph

Given an undirected unweighted graph with **N** vertices and **M** edges. The task is to find two disjoint good sets of vertices. A set X is called good if for every edge UV in the graph at least one of the endpoint belongs to X(i.e, U or V or both U and V belongs to X).

If it is not possible to make such sets then print -1.

**Examples:**

Input :

Output :{1 3 4 5} ,{2 6}

One disjoint good set contains vertices {1, 3, 4, 5} and other contains {2, 6}.

Input :

Output :-1

**Approach:**

One of the observation is that there is no edge UV that U and V are in the same set.The two good sets form a bipartition of the graph, so the graph has to be bipartite. And being bipartite is also sufficient. Read about bipartition here.

Below is the implementation of the above approach :

## C++

`// C++ program to find two disjoint ` `// good sets of vertices in a given graph ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` `#define N 100005 ` ` ` `// For the graph ` `vector<` `int` `> gr[N], dis[2]; ` `bool` `vis[N]; ` `int` `colour[N]; ` `bool` `bip; ` ` ` `// Function to add edge ` `void` `Add_edge(` `int` `x, ` `int` `y) ` `{ ` ` ` `gr[x].push_back(y); ` ` ` `gr[y].push_back(x); ` `} ` ` ` `// Bipartie function ` `void` `dfs(` `int` `x, ` `int` `col) ` `{ ` ` ` `vis[x] = ` `true` `; ` ` ` `colour[x] = col; ` ` ` ` ` `// Check for child vertices ` ` ` `for` `(` `auto` `i : gr[x]) { ` ` ` ` ` `// If it is not visited ` ` ` `if` `(!vis[i]) ` ` ` `dfs(i, col ^ 1); ` ` ` ` ` `// If it is already visited ` ` ` `else` `if` `(colour[i] == col) ` ` ` `bip = ` `false` `; ` ` ` `} ` `} ` ` ` `// Function to find two disjoint ` `// good sets of vertices in a given graph ` `void` `goodsets(` `int` `n) ` `{ ` ` ` `// Initially assume that graph is bipartie ` ` ` `bip = ` `true` `; ` ` ` ` ` `// For every unvisited vertex call dfs ` ` ` `for` `(` `int` `i = 1; i <= n; i++) ` ` ` `if` `(!vis[i]) ` ` ` `dfs(i, 0); ` ` ` ` ` `// If graph is not bipartie ` ` ` `if` `(!bip) ` ` ` `cout << -1; ` ` ` `else` `{ ` ` ` ` ` `// Differentiate two sets ` ` ` `for` `(` `int` `i = 1; i <= n; i++) ` ` ` `dis[colour[i]].push_back(i); ` ` ` ` ` `// Print vertices belongs to both sets ` ` ` ` ` `for` `(` `int` `i = 0; i < 2; i++) { ` ` ` ` ` `for` `(` `int` `j = 0; j < dis[i].size(); j++) ` ` ` `cout << dis[i][j] << ` `" "` `; ` ` ` `cout << endl; ` ` ` `} ` ` ` `} ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `int` `n = 6, m = 4; ` ` ` ` ` `// Add edges ` ` ` `Add_edge(1, 2); ` ` ` `Add_edge(2, 3); ` ` ` `Add_edge(2, 4); ` ` ` `Add_edge(5, 6); ` ` ` ` ` `// Function call ` ` ` `goodsets(n); ` `} ` |

*chevron_right*

*filter_none*

## Python 3

`# Python 3 program to find two disjoint ` `# good sets of vertices in a given graph ` `N ` `=` `100005` ` ` `# For the graph ` `gr ` `=` `[[] ` `for` `i ` `in` `range` `(N)] ` `dis ` `=` `[[] ` `for` `i ` `in` `range` `(` `2` `)] ` `vis ` `=` `[` `False` `for` `i ` `in` `range` `(N)] ` `colour ` `=` `[` `0` `for` `i ` `in` `range` `(N)] ` `bip ` `=` `0` ` ` `# Function to add edge ` `def` `Add_edge(x, y): ` ` ` `gr[x].append(y) ` ` ` `gr[y].append(x) ` ` ` `# Bipartie function ` `def` `dfs(x, col): ` ` ` `vis[x] ` `=` `True` ` ` `colour[x] ` `=` `col ` ` ` ` ` `# Check for child vertices ` ` ` `for` `i ` `in` `gr[x]: ` ` ` ` ` `# If it is not visited ` ` ` `if` `(vis[i] ` `=` `=` `False` `): ` ` ` `dfs(i, col ^ ` `1` `) ` ` ` ` ` `# If it is already visited ` ` ` `elif` `(colour[i] ` `=` `=` `col): ` ` ` `bip ` `=` `False` ` ` `# Function to find two disjoint ` `# good sets of vertices in a given graph ` `def` `goodsets(n): ` ` ` ` ` `# Initially assume that ` ` ` `# graph is bipartie ` ` ` `bip ` `=` `True` ` ` ` ` `# For every unvisited vertex call dfs ` ` ` `for` `i ` `in` `range` `(` `1` `, n ` `+` `1` `, ` `1` `): ` ` ` `if` `(vis[i] ` `=` `=` `False` `): ` ` ` `dfs(i, ` `0` `) ` ` ` ` ` `# If graph is not bipartie ` ` ` `if` `(bip ` `=` `=` `0` `): ` ` ` `print` `(` `-` `1` `) ` ` ` `else` `: ` ` ` ` ` `# Differentiate two sets ` ` ` `for` `i ` `in` `range` `(` `1` `, n ` `+` `1` `, ` `1` `): ` ` ` `dis[colour[i]].append(i) ` ` ` ` ` `# Print vertices belongs to both sets ` ` ` `for` `i ` `in` `range` `(` `2` `): ` ` ` `for` `j ` `in` `range` `(` `len` `(dis[i])): ` ` ` `print` `(dis[i][j], end ` `=` `" "` `) ` ` ` `print` `(` `'\n'` `, end ` `=` `"") ` ` ` `# Driver code ` `if` `__name__ ` `=` `=` `'__main__'` `: ` ` ` `n ` `=` `6` ` ` `m ` `=` `4` ` ` ` ` `# Add edges ` ` ` `Add_edge(` `1` `, ` `2` `) ` ` ` `Add_edge(` `2` `, ` `3` `) ` ` ` `Add_edge(` `2` `, ` `4` `) ` ` ` `Add_edge(` `5` `, ` `6` `) ` ` ` ` ` `# Function call ` ` ` `goodsets(n) ` ` ` `# This code is contributed ` `# by Surendra_Gangwar ` |

*chevron_right*

*filter_none*

**Output:**

1 3 4 5 2 6

## Recommended Posts:

- Calculate number of nodes between two vertices in an acyclic Graph by Disjoint Union method
- Find K vertices in the graph which are connected to at least one of remaining vertices
- Find maximum number of edge disjoint paths between two vertices
- Disjoint Set (Or Union-Find) | Set 1 (Detect Cycle in an Undirected Graph)
- Find if there is a path between two vertices in a directed graph
- Maximum Possible Edge Disjoint Spanning Tree From a Complete Graph
- Articulation Points (or Cut Vertices) in a Graph
- Construct a graph from given degrees of all vertices
- Finding in and out degrees of all vertices in a graph
- Minimum number of edges between two vertices of a graph using DFS
- Number of Simple Graph with N Vertices and M Edges
- Maximum and minimum isolated vertices in a graph
- Minimum number of edges between two vertices of a Graph
- Largest subset of Graph vertices with edges of 2 or more colors
- Check whether given degrees of vertices represent a Graph or Tree

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.