Skip to main content

Possible Bipartition - Bipartite Graph

Problem Statement

We want to split a group of n people (labeled from 1 to n) into two groups of any size. Each person may dislike some other people, and they should not go into the same group.

Given the integer n and the array dislikes where dislikes[i] = [ai, bi] indicates that the person labeled ai does not like the person labeled bi, return true if it is possible to split everyone into two groups in this way.

Examples

Example 1:

Input: n = 4, dislikes = [[1,2],[1,3],[2,4]]
Output: true
Explanation: group1 [1,4] and group2 [2,3].

Example 2:

Input: n = 3, dislikes = [[1,2],[1,3],[2,3]]
Output: false

Example 3:

Input: n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
Output: false

Constraints

  • 1 <= n <= 2000
  • 0 <= dislikes.length <= 104
  • dislikes[i].length == 2
  • 1 <= dislikes[i][j] <= n
  • ai < bi
  • All the pairs of dislikes are unique.

Solution

C++ Solution
#include<bits/stdc++.h>
using namespace std;

#define WHITE -1
#define RED 0
#define BLUE 1

class Solution {
private:
bool isBipartite(int node, vector<vector<int>> &G, vector<int> &nodes) {
for(int next: G[node]) {
if(nodes[node] == nodes[next]) return false;
if(nodes[next] != WHITE) continue;
nodes[next] = nodes[node] == RED ? BLUE : RED;
if(isBipartite(next, G, nodes) == false) return false;
}
return true;
}
public:
bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
vector<int> nodes(n+1, WHITE);
vector<vector<int>> G(n+1);
for(auto pair: dislikes) {
int a = pair[0];
int b = pair[1];
G[a].push_back(b);
G[b].push_back(a);
}

for(int i = 1; i <= n; ++i) {
if(nodes[i] != WHITE) continue;
nodes[i] = RED;
if(isBipartite(i, G, nodes) == false) {
return false;
}
}

return true;
}
};

int main() {
Solution* obj = new Solution();
int n = 5;
vector<vector<int>> dislikes = {{1,2},{3,4},{4,5},{3,5}};
cout << obj->possibleBipartition(n, dislikes);
return 0;
}

References