zoukankan      html  css  js  c++  java
  • 785. Is Graph Bipartite? (是否二分图)

    package LeetCode_785
    
    import java.util.*
    
    /**
     * 785. Is Graph Bipartite? (是否二分图)
     * https://leetcode.com/problems/is-graph-bipartite/description/
     *
     * Given an undirected graph, return true if and only if it is bipartite.
    Recall that a graph is bipartite if we can split it's set of nodes into two independent subsets A and B such that every edge in the graph has one node in A and another node in B.
    The graph is given in the following form: graph[i] is a list of indexes j for which the edge between nodes i and j exists.
    Each node is an integer between 0 and graph.length - 1.
    There are no self edges or parallel edges: graph[i] does not contain i, and it doesn't contain any element twice.
    
    Example 1:
    Input: [[1,3], [0,2], [1,3], [0,2]]
    Output: true
    Explanation:
    The graph looks like this:
    0----1
    |    |
    |    |
    3----2
    We can divide the vertices into two groups: {0, 2} and {1, 3}.
    
    Example 2:
    Input: [[1,2,3], [0,2], [0,1,3], [0,2]]
    Output: false
    Explanation:
    The graph looks like this:
    0----1
    |   |
    |   |
    3----2
    We cannot find a way to divide the set of nodes into two independent subsets.
    
    Note:
    graph will have length in range [1, 100].
    graph[i] will contain integers in range [0, graph.length - 1].
    graph[i] will not contain i or duplicate values.
    The graph is undirected: if any element j is in graph[i], then i will be in graph[j].
     * */
    class Solution {
        /*
        * solution: BFS, Time complexity:O(V+E), Space complexity:O(V)
        * */
        private var colorArray: IntArray? = null
    
        fun isBipartite(graph: Array<IntArray>): Boolean {
            val n = graph.size
            //set the color array
            //-1:no color, 0:red
            colorArray = IntArray(n,{-1})
            for (i in 0 until n) {
                if (colorArray!![i] == -1) {
                    colorArray!![i] = 0
                    if (!computingColor(graph, i)) {
                        return false
                    }
                }
            }
            return true
        }
    
        private fun computingColor(graph: Array<IntArray>, current: Int): Boolean {
            val queue = LinkedList<Int>()
            queue.offer(current)
            while (queue.isNotEmpty()) {
                val temp = queue.poll()
                val c = colorArray!![temp]
                //find all non-color adjacent
                for (i in graph[temp]) {
                    if (colorArray!![i] == -1) {
                        //to give opposite color to neighbour
                        colorArray!![i] = (c.xor(1))
                        queue.offer(i)
                    } else {
                        if (colorArray!![i]!=(c.xor(1))){
                            return false
                        }
                    }
                }
            }
            return true
        }
    }
  • 相关阅读:
    单片机编程积累算法
    关于GSM基站定位
    GSM模块fibocom G510使用记录
    指爱 打字比赛记录
    硬件和软件工程师
    GPS模块启动模式说明
    阻容降压电路分析
    饮水机电路-工作剖析
    跑步,去
    day01 IT知识架构,操作系统简介
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13358391.html
Copyright © 2011-2022 走看看