解题思路
首先用一个二维数组存储每个人不喜欢的人的列表,定义一个存储分组类型的n+1维数组,用来标记每个人分到的组序号(1或者2,0代表未分组),从第一个人开始遍历,遇到未分组的不喜欢的人继续遍历,不断dfs,中间根据是否分组、分组后是否有冲突进行判断,注释已经很详尽了,代码如下:
代码
class Solution {
public:
// 存储分组类型
vector<int> color;
// 存储不喜欢人列表
vector<vector<int>> count;
bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
color = vector<int>(n + 1, 0);
count = vector<vector<int>>(n + 1);
// 用二维数组存储每个人不喜欢的人的列表
for(auto& dislike : dislikes) {
count[dislike[0]].push_back(dislike[1]);
count[dislike[1]].push_back(dislike[0]);
}
// 遍历每个人
for(int i = 1; i <= n; i ++) {
// 如果没分组且分组后有冲突
if(color[i] == 0 && !dfs(i, 1)) {
return false;
}
}
return true;
}
bool dfs(int cur, int cur_color) {
// 分组
color[cur] = cur_color;
// 遍历不喜欢人列表
for(auto& node : count[cur]) {
// 如果分组并且和当前不喜欢的人在一组,冲突
if(color[node] && color[node] == cur_color) {
return false;
}
// 如果未分组且分组后有冲突
if(!color[node] && !dfs(node, 3 ^ cur_color)) {
return false;
}
}
return true;
}
};