其他分享
首页 > 其他分享> > LeetCode 785 Is Graph Bipartite? (dfs 染色)

LeetCode 785 Is Graph Bipartite? (dfs 染色)

作者:互联网

There is an undirected graph with n nodes, where each node is numbered between 0 and n - 1. You are given a 2D array graph, where graph[u] is an array of nodes that node u is adjacent to. More formally, for each v in graph[u], there is an undirected edge between node u and node v. The graph has the following properties:

A graph is bipartite if the nodes can be partitioned into two independent sets A and B such that every edge in the graph connects a node in set A and a node in set B.

Return true if and only if it is bipartite.

Example 1:

Input: graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
Output: false
Explanation: There is no way to partition the nodes into two independent sets such that every edge connects a node in one and a node in the other.

Example 2:

Input: graph = [[1,3],[0,2],[1,3],[0,2]]
Output: true
Explanation: We can partition the nodes into two sets: {0, 2} and {1, 3}.

Constraints:

题目链接:https://leetcode.com/problems/is-graph-bipartite/

题目大意:给一个图(不一定连通)问能否将点分成两个集合,要求任意一条边的两个顶点分别在两个点集中

题目分析:经典染色题,对未染色的节点选择另一个颜色集进行染色,若发现一个冲突则不存在解

0ms,时间击败100%

class Solution {
    
    boolean ok = true;
    boolean[] color1;
    boolean[] color2;
    
    void dfs(int u, int[][] graph, int n) {
        if (!ok) {
            return;
        }
        for (int i = 0; i < graph[u].length; i++) {
            int v = graph[u][i];
            if (color1[u]) {
                if (color1[v]) {
                    ok = false;
                    return;
                }
                if (color2[v]){
                    continue;
                }
                color2[v] = true;
            } else if (color2[u]) {
                if (color2[v]) {
                    ok = false;
                    return;
                }
                if (color1[v]) {
                    continue;
                }
                color1[v] = true;
            }
            if (ok) {
                dfs(v, graph, n);
            }
        }
    }
    
    public boolean isBipartite(int[][] graph) {
        int n = graph.length;
        color1 = new boolean[n];
        color2 = new boolean[n];
        
        for (int i = 0; i < n; i++) {
            if (!color1[i] && !color2[i]) {
                Arrays.fill(color1, false);
                Arrays.fill(color2, false);
                color1[i] = true;
                dfs(i, graph, n);
                if (!ok) {
                    break;
                }
            }
        }
        return ok;
    }
}

标签:node,785,ok,int,graph,dfs,color1,color2,LeetCode
来源: https://blog.csdn.net/Tc_To_Top/article/details/120686428