zoukankan      html  css  js  c++  java
  • 886. Possible Bipartition

    Given a set of n people (numbered 1, 2, ..., n), we would like to split everyone into two groups of any size.

    Each person may dislike some other people, and they should not go into the same group. 

    Formally, if dislikes[i] = [a, b], it means it is not allowed to put the people numbered a and b into the same group.

    Return true if and only if it is possible to split everyone into two groups in this way.

     

    Example 1:

    Input: n = 4, dislikes = [[1,2],[1,3],[2,4]]
    Output: true
    Explanation: group1 [1,4], group2 [2,3]
    

    Example 2:

    Input: n = 3, dislikes = [[1,2],[1,3],[2,3]]
    Output: false
    

    Example 3:

    Input: n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
    Output: false
    

    Constraints:

    • 1 <= n <= 2000
    • 0 <= dislikes.length <= 10000
    • dislikes[i].length == 2
    • 1 <= dislikes[i][j] <= n
    • dislikes[i][0] < dislikes[i][1]
    • There does not exist i != j for which dislikes[i] == dislikes[j].
    class Solution {
        public boolean possibleBipartition(int n, int[][] dis) {
            int[] visited = new int[n + 1];
            List<Integer>[] graph = new ArrayList[n + 1];
            for(int i = 0; i <= n; i++) graph[i] = new ArrayList();
            for(int[] dislike: dis) {
                int fr = dislike[0], to = dislike[1];
                graph[fr].add(to);
                graph[to].add(fr);
            }
            for(int i = 1; i <= n; i++) {
                if(visited[i] == 0 && graph[i].size() > 0) {
                    visited[i] = 1;
                    Queue<Integer> q = new LinkedList();
                    q.offer(i);
                    while(!q.isEmpty()) {
                        int cur = q.poll();
                        for(int j : graph[cur]) {
                            if(visited[j] == 0) {
                                visited[j] = (visited[cur] == 1 ? 2 : 1);
                                q.offer(j);
                            }
                            else {
                                if(visited[j] == visited[cur]) return false;
                            }
                        }
                    }
                }
            }
            return true;
        }
    }

    和785一样,但是得先建立graph,完了之后bfs涂色

    class Solution {
        public boolean possibleBipartition(int N, int[][] dislikes) {
            Map<Integer, List<Integer>> map = new HashMap();
            for(int[] dis : dislikes) {
                map.computeIfAbsent(dis[0], a -> new ArrayList()).add(dis[1]);
                map.computeIfAbsent(dis[1], a -> new ArrayList()).add(dis[0]);
            }
            int[] color = new int[N + 1];
            
            for(int i = 1; i <= N; i++) {
                if(color[i] == 0) {
                    color[i] = 1;
                    Queue<Integer> q = new LinkedList();
                    q.offer(i);
                    while(!q.isEmpty()) {
                        int cur = q.poll();
                        if(map.containsKey(cur)) {
                            for(int nei : map.get(cur)) {
                                if(color[nei] == 0){
                                    color[nei] = color[cur] == 1 ? 2 : 1;
                                    q.offer(nei);
                                } 
                                else {
                                    if(color[nei] == color[cur]) return false;
                                }
                                
                            }
                        }
                        
                    }
                }
            }
            return true;
        }
    }
  • 相关阅读:
    销傲中国式销售过程管理系统功能概述
    真正高效的SQLSERVER分页查询(多种方案)
    request.getScheme()的使用方法
    用户'sa'登录失败(错误18456)解决方案图解
    在SQL Server中创建用户角色及授权
    大话设计模式--外观模式 Facade -- C++实现实例
    大话设计模式--模板方法模式 TemplateMethod -- C++ 实现
    大话设计模式--原型模式 Prototype -- C++实现
    C++拷贝构造函数(深拷贝,浅拷贝)
    大话设计模式--工厂方法模式 Factory Method -- C++实现
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/14957132.html
Copyright © 2011-2022 走看看