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
    }
}

 

posted @ 2020-07-22 01:21  johnny_zhao  阅读(135)  评论(0编辑  收藏  举报