1. 题目描述:
给定一组 n 人(编号为 1, 2, …, n), 我们想把每个人分进任意大小的两组,不喜欢对方的人不能分为一组。
给定整数 n 和数组 dislikes ,其中 dislikes[i] = [ai, bi] ,表示不允许将编号为 ai 和 bi的人归入同一组。当可以用这种方法将所有人分进两组时,返回 true;否则返回 false。
链接:https://leetcode.cn/problems/possible-bipartition
示例:
2. 思路
染色法 —— 用两种颜色给节点染色,互相不喜欢的节点不能染相同颜色,判断染色过程中有无颜色冲突产生,若有颜色冲突,则返回 false。
图解:
以 n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]] 为例,图解如下
3. 代码
class Solution {
private List<Integer>[] g;
private int[] color;
public boolean possibleBipartition(int n, int[][] dislikes) {
g = new List[n];
color = new int[n];
for (int i = 0; i < n; ++i) {
g[i] = new ArrayList<>();
}
for (var e : dislikes) {
int a = e[0] - 1, b = e[1] - 1;
g[a].add(b);
g[b].add(a);
}
for (int i = 0; i < n; ++i) {
if (color[i] == 0) {
if (!dfs(i, 1)) {
return false;
}
}
}
return true;
}
private boolean dfs(int i, int c) {
color[i] = c;
for (int j : g[i]) {
if (color[j] == c) {
return false;
}
if (color[j] == 0 && !dfs(j, 3 - c)) {
return false;
}
}
return true;
}
}