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;
        }
    }
  • 相关阅读:
    【转】如何高效地阅读技术类书籍与博客
    测试站点大全
    【转】软件测试面试- 购物车功能测试用例设计
    div+css 定位浅析
    C# Enum,Int,String的互相转换
    sqlserver 空间数据类型
    系统学习sqlserver2012 一
    sql查询数据库中所有表的记录条数,以及占用磁盘空间大小。
    linux网站推荐
    匿名用户访问sharepoint2010中的列表
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/14957132.html
Copyright © 2011-2022 走看看