Leetcode 886. 可能的二分法 题解

题目链接: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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42396397/article/details/106241915
今日推荐