题目链接:https://leetcode-cn.com/problems/possible-bipartition/
最近学习的二分染色,开始 color 数组初始化为 -1,深搜打进去,每次的 dislike 对象若没染色,则染色为当前颜色的对立颜色(0、1),并继续深搜,否则若跟当前颜色相同,说明有错误,return false即可
代码如下:
class Solution {
public:
bool dfs(int pos, vector<int>& color, vector<vector<int>>& e) {
//printf("pos = %d, color[%d] = %d\n", pos, pos, color[pos]);
//printf("e[%d].size() = %d\n", pos, e[pos].size());
for(int i = 0; i < e[pos].size(); i++) {
if(color[e[pos][i]] == color[pos]) {
//printf("%d WRONG!\n", pos);
return false;
} else if(color[e[pos][i]] == -1) {
//printf("%d NEXT!\n", pos);
color[e[pos][i]] = 1 - color[pos];
//printf("UPDATE: color[%d] = 1 - color[%d]\n", e[pos][i], pos);
bool res = dfs(e[pos][i], color, e);
if(!res) {
return false;
}
}
}
return true;
}
bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
vector<vector<int>> e(N + 1, vector<int>(0));
vector<int> color(N + 1, -1);
for(int i = 0; i < dislikes.size(); i++) {
e[dislikes[i][0]].push_back(dislikes[i][1]);
e[dislikes[i][1]].push_back(dislikes[i][0]);
}
// for(int i = 1; i <= N; i++) {
// for(int j = 0; j < e[i].size(); j++) {
// printf("e[%d][%d] = %d\n", i, j, e[i][j]);
// }
// }
for(int i = 1; i <= N; i++) {
if(color[i] == -1) {
//printf("Init %d\n", i);
color[i] = 0;
bool res = dfs(i, color, e);
if(!res) {
return false;
}
}
}
return true;
}
};