1. 程式人生 > 實用技巧 >補充netty權威指南學習自定義協議實現

補充netty權威指南學習自定義協議實現

題目:判斷二分圖

問題描述:

給定一個無向圖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;
    }
}