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;
}