1. 程式人生 > 實用技巧 >leetcode每日一題(2020-07-16):785.判斷二分圖

leetcode每日一題(2020-07-16):785.判斷二分圖

題目描述:
給定一個無向圖graph,當這個圖為二分圖時返回true。
如果我們能將一個圖的節點集合分割成兩個獨立的子集A和B,並使圖中的每一條邊的兩個節點一個來自A集合,一個來自B集合,我們就將這個圖稱為二分圖。
graph將會以鄰接表方式給出,graph[i]表示圖中與節點i相連的所有節點。每個節點都是一個在0到graph.length-1之間的整數。這圖中沒有自環和平行邊: graph[i] 中不存在i,並且graph[i]中沒有重複的值。
【注意:有很多孤立點!!!!】

今日學習:
1.染色法判斷二分圖

題解:
1.沒想到用dfs,失敗了
2.dfs,給v染色,判斷與v鄰接的w:染色?false?

/**
 * @param {number[][]} graph
 * @return {boolean}
 */
/*var isBipartite = function(graph) {
    let n = graph.length
    //0代表黑色,1代表白色,2代表未染色
    const color = new Array(n).fill(2)
    color[0] = 0
    for(let i = 0; i < n; i++) {
        if(color[i] == 2) {
            for(let j = 0; j < graph[i].length; j++) {
                if(color[i] == 2 && color[graph[i][j]] != 2) {
                    color[i] = color[graph[i][j]] == 0 ? 1 : 0
                }else if(color[i] != 2 && color[graph[i][j]] != 2) {
                    if(color[i] == color[graph[i][j]]) {
                        return false
                    }
                }
            }
            if(color[i] == 2) {
                color[i] = 0
            }
        }
        for(let j = 0; j < graph[i].length; j++) {
            if(color[graph[i][j]] == 2) {
                color[graph[i][j]] = color[i] == 0 ? 1 : 0
            }else if(color[graph[i][j]] == color[i]) {
                return false
            }
        }
    }
    return true
};*/
var isBipartite = function(graph) {
    //點的個數
    let n = graph.length
    //空圖返回true
    if(n == 1 && graph[0].length == 0) return true
    //點的顏色
    const colors = new Array(n)
    //是否染過色
    const marked = new Array(n).fill(false)
    //點0先染色
    colors[0] = true
    //dfs:標記當前點,給沒染色的鄰接點染色,進入該點繼續dfs;判斷染過色的鄰接點顏色是否相同
    var dfs = function(v, G) {
        marked[v] = true
        for(let j in G[v]){
            let w = G[v][j]
            if(!marked[w]){
                colors[w] = !colors[v]
                if(!dfs(w,G)) {
                    return false
                }
            }else if(colors[w] == colors[v]){
                return false
            }
        }
        return true
    }
    for(let i = 0; i < n; i++){
        if(marked[i] == false){
            if(graph[i].length != 0) {
                if(!dfs(i, graph)){
                    return false
                } 
            }
        }
    }
    return true
}