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之路的主要内容,如果未能解决你的问题,请参考以下文章