Leetcode--Java--785. 判断二分图

这篇博客介绍了如何使用Java解决LeetCode上的785题,即判断一个图是否为二分图。博主通过染色法(DFS和BFS)来解决这个问题,解释了二分图的概念,并提供了相应的代码实现。

题目描述

在这里插入图片描述

样例描述

在这里插入图片描述

思路

染色法 (DFS + 递归 / BFS )
一个图是二分图等价于图可以被二染色等价于图中不含有奇数环
在这里插入图片描述
染色法的思路:
在这里插入图片描述
图的存储最常用是链式前向星,参考这里,本题就用二维数组存储图即可

代码

dfs + 递归思想

class Solution {
    int g[][];
    int vis[];
    public boolean isBipartite(int[][] graph) {
        int n = graph.length;
        g = graph;
        vis = new int[n]; //0表示未染色,1和-1表示两种颜色
        for (int i = 0; i < n; i ++ ) {
                //没有染色就进行染色,失败就直接false
                if (vis[i] == 0 && !dfs(i, 1)) {
                    return false;
                }
        }
        return true;
    }
    public boolean dfs(int u, int color) {
        //如果已经染过色,对比是否一样   不一样就矛盾
        if (vis[u] != 0) {
            return vis[u] == color;
        }
        vis[u] = color;
        for (int vtx: g[u]) {
            //将所有相邻的结点染成不同的颜色
            if (!dfs(vtx, -color)) {
                return false;
            }
        }
        return true;
    }
}

BFS

class Solution {
    public boolean isBipartite(int[][] graph) {
        int n = graph.length;
        int vis[] = new int[n];
        Deque<Integer> q = new LinkedList<>();
        //由于可能有多个连通域,要遍历每个结点
        for (int i = 0; i < n; i ++ ) {
            //如果顶点访问过
            if (vis[i] != 0) {
                continue;
            }
            q.offer(i);
            vis[i] = 1;
            while (!q.isEmpty()) {
                int node = q.poll();
                //遍历所有的邻结点
                for (int v: graph[node]) {
                    //颜色一样就false
                    if (vis[v] == vis[node]) {
                        return false;
                    }
                    //染相反的颜色,然后入队
                    if (vis[v] == 0) {
                        vis[v] = -vis[node];
                        q.offer(v);
                    }
                }
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值