染色法 01

染色法 01


LeetCode 785

https://leetcode-cn.com/problems/is-graph-bipartite/

解题思路


785 题解

根据本题题意,可以遍历一遍图,然后将每个节点的邻接点都染成当前节点不同的颜色,并在染色的时候判断是否出现相邻节点同色的情况。
若出现可以返回false,不是二分图
直到最后都符合相邻节点都是不同色的,则是二分图

在遍历图的时候可以使用dfs和bfs,所以本题有两种解法

BFS

public class test {

    public boolean isBipartite(int[][] graph) {
        // visited 数组,0 表示未访问,1 和 -1 表示两种颜色
        int[] visited = new int[graph.length];
        Queue queue = new LinkedList<>();
        // 将图中所有的节点都遍历一遍,确保所有节点可以被访问到,进行bfs 染色
        for (int i = 0; i < graph.length; i++) {
            if (visited[i] != 0) { // 如果染过色了,就直接跳过该节点
                continue;
            }
            // 每遍历到一个节点,就把它的邻接节点都染成相反的颜色,并入队
            queue.offer(i);
            visited[i] = 1; // 当前节点染成 1 色
            while (!queue.isEmpty()) {
                int v = queue.poll(); // 将队列挨个出队
                for (int w : graph[v]) { // 遍历邻接节点
                    if (visited[w] == visited[v]) {
                        return false; // 邻接节点与当前节点同色
                    }
                    if (visited[w] == 0) { // 未遍历过,则染相反色,并入队
                        visited[w] = -visited[v];
                        queue.offer(w);
                    }
                }
            }
        }
        return true;
    }
}

DFS

public class test {

    public boolean isBipartite(int[][] graph) {
        // 定义 visited 数组,初始值为 0 表示未被访问,赋值为 1 或者 -1 表示两种不同的颜色。
        int[] visited = new int[graph.length];
        // 因为图中可能含有多个连通域,所以我们需要判断是否存在顶点未被访问,若存在则从它开始再进行一轮 dfs 染色。
        for (int i = 0; i < graph.length; i++) {
            if (visited[i] == 0 && !dfs(graph, i, 1, visited)) {
                return false;
            }
        }
        return true;
    }

    private boolean dfs(int[][] graph, int v, int color, int[] visited) {
        // 如果要对某顶点染色时,发现它已经被染色了,则判断它的颜色是否与本次要染的颜色相同,如果矛盾,说明此无向图无法被正确染色,返回 false。
        if (visited[v] != 0) {
            return visited[v] == color;
        }
        // 对当前顶点进行染色,并将当前顶点的所有邻接点染成相反的颜色。
        visited[v] = color;
        for (int w: graph[v]) {
            if (!dfs(graph, w, -color, visited)) {
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(染色法 01)