LeetCode 886 可能的二分法[dfs] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 886 可能的二分法[dfs] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

解题思路

首先用一个二维数组存储每个人不喜欢的人的列表,定义一个存储分组类型的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;
    
;

以上是关于LeetCode 886 可能的二分法[dfs] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode(886)-可能的二分法

力扣 每日一题 886. 可能的二分法难度:中等,rating: 1794(并查集 / 拆点优化的扩展域并查集)

LeetCode 0886. 可能的二分法

每日一题886. 可能的二分法

二分问题-LeetCode 3334(上下边界,二分查找)

LeetCode 1723 完成所有工作的最短时间[二分法 回溯] HERODING的LeetCode之路