leetcode每日一題(2020-07-16):785.判斷二分圖
阿新 • • 發佈:2020-07-16
題目描述:
給定一個無向圖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 }