886. 可能的二分法

给定一组 N 人(编号为 1, 2, …, N), 我们想把每个人分进任意大小的两组。

每个人都可能不喜欢其他人,那么他们不应该属于同一组。

形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。

当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。

示例 1:

输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]
输出:true
解释:group1 [1,4], group2 [2,3]

思路:将一组染色(例如红色),那么这个人不喜欢的人一定在另一种颜色中(例如蓝色),然后再继续进行BFS,此时将不喜欢的人的不喜欢的人染成红色,如果染色中间发生了冲突,那么就不能完成分组;

class Solution {
    List<Integer>[] lists;
    Map<Integer,Integer> map;
    public boolean possibleBipartition(int N, int[][] dislikes) {
        lists = new ArrayList[N+1];
        map = new HashMap<>();
        for(int i=0;i<=N;i++)
         lists[i] = new ArrayList<>();
        
        for(int[] dislike:dislikes){
            lists[dislike[0]].add(dislike[1]);
            lists[dislike[1]].add(dislike[0]);
        }

        for(int i=1;i<=N;i++){
            if(!map.containsKey(i)){
               boolean ok= dfs(i,0);
               if(!ok)
               return false;
            }
        }
        return true;
    }

    private boolean dfs(int index,int c){
        if(map.containsKey(index)){
            boolean ok = map.get(index)==c;
            return ok;
        }

        map.put(index,c);
        for(int node:lists[index]){
           boolean ok= dfs(node,c^1);
           if(!ok)
           return false;
        }
        return true;
    }
}

版权声明:本文为smile_study1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。