给定一组 N 人(编号为 1, 2, …, N), 我们想把每个人分进任意大小的两组。
每个人都可能不喜欢其他人,那么他们不应该属于同一组。
形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。
当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。
示例 1:
输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]
输出:true
解释:group1 [1,4], group2 [2,3]
思路:将一组染色(例如红色),那么这个人不喜欢的人一定在另一种颜色中(例如蓝色),然后再继续进行BFS,此时将不喜欢的人的不喜欢的人染成红色,如果染色中间发生了冲突,那么就不能完成分组;
class Solution {
List<Integer>[] lists;
Map<Integer,Integer> map;
public boolean possibleBipartition(int N, int[][] dislikes) {
lists = new ArrayList[N+1];
map = new HashMap<>();
for(int i=0;i<=N;i++)
lists[i] = new ArrayList<>();
for(int[] dislike:dislikes){
lists[dislike[0]].add(dislike[1]);
lists[dislike[1]].add(dislike[0]);
}
for(int i=1;i<=N;i++){
if(!map.containsKey(i)){
boolean ok= dfs(i,0);
if(!ok)
return false;
}
}
return true;
}
private boolean dfs(int index,int c){
if(map.containsKey(index)){
boolean ok = map.get(index)==c;
return ok;
}
map.put(index,c);
for(int node:lists[index]){
boolean ok= dfs(node,c^1);
if(!ok)
return false;
}
return true;
}
}