補充netty權威指南學習自定義協議實現
阿新 • • 發佈:2020-09-08
題目:判斷二分圖
問題描述:
給定一個無向圖graph,當這個圖為二分圖時返回true。
如果我們能將一個圖的節點集合分割成兩個獨立的子集A和B,並使圖中的每一條邊的兩個節點一個來自A集合,一個來自B集合,我們就將這個圖稱為二分圖。
graph將會以鄰接表方式給出,graph[i]表示圖中與節點i相連的所有節點。每個節點都是一個在0到graph.length-1之間的整數。這圖中沒有自環和平行邊: graph[i] 中不存在i,並且graph[i]中沒有重複的值。
示例:
見LeetCode判斷二分圖
解決程式碼:
public class isBipartiteTest { public boolean isBipartite(int[][] graph) { // 無向圖節點數量 int nodeNum = graph.length; // 無向圖中節點以及鄰節點的著色情況 int[] color = new int[nodeNum]; // 此處只要初始化為除 0 或 1 之外的數即可 Arrays.fill(color, -1); for(int i = 0; i < nodeNum; i++) { // 若當前節點還未著色 if(color[i] == -1) { Stack<Integer> stack = new Stack<>(); // 將當前節點入棧 stack.push(i); // 為當前節點著色為 1 color[i] = 0; // 直到當前節點以及其所有鄰節點均已著色完畢後退出迴圈 while(!stack.isEmpty()) { int node = stack.pop(); // 遍歷當前節點的所有鄰節點的著色情況 for(int nei : graph[node]) { // 若當前鄰節點還未著色 if(color[nei] == -1) { // 將當前鄰節點入棧 stack.push(nei); // 可保證當前鄰節點與當前節點的著色情況不同 color[nei] = color[node] ^ 1; } else if(color[nei] == color[node]) { // 當前節點與鄰節點著色相同,不是二分圖,直接返回結果 return false; } } } } } return true; } }