LeetCode 785 Is Graph Bipartite? (dfs 染色)

244 篇文章 0 订阅
91 篇文章 1 订阅

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:

  • There are no self-edges (graph[u] does not contain u).
  • There are no parallel edges (graph[u] does not contain duplicate values).
  • If v is in graph[u], then u is in graph[v] (the graph is undirected).
  • The graph may not be connected, meaning there may be two nodes u and v such that there is no path between them.

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:

  • graph.length == n
  • 1 <= n <= 100
  • 0 <= graph[u].length < n
  • 0 <= graph[u][i] <= n - 1
  • graph[u] does not contain u.
  • All the values of graph[u] are unique.
  • If graph[u] contains v, then graph[v] contains u.

题目链接: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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值