java数据结构与算法刷题-----LeetCode785. 判断二分图

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 深度优先
    • 广度优先

在这里插入图片描述
在这里插入图片描述

二分图:将所有结点分成两个集合,每条边的两个顶点处于不同的集合中。或者说图中顶点分成红色和绿色的两种。一条边相连的顶点(邻居),必须不同颜色。将相同颜色的顶点划分到一个集合。如果能够实现,就是二分图。
只要相邻(一条边相连的两个)顶点,颜色一样,就不是二分图

深度优先

解题思路:时间复杂度O( n + m n+m n+m),n是顶点个数,m是边的数量,空间复杂度O( n n n),保存每个顶点的颜色信息
  1. 为每个顶点上色,红色和绿色
  2. 如果当前顶点为红色,相邻的顶点必须是绿色
  3. 如果相邻的顶点已经上色,并且和当前顶点颜色相同,就不是二分图
  4. 也就是说,保证一条边相连顶点颜色不同,如果整个图都满足就是二分图,只要有任何一条边的两个顶点颜色相同就不是二分图
代码

在这里插入图片描述

class Solution {
    private static final int UNCOLORED = 0;//标志一个结点为无颜色
    private static final int RED = 1;//标志一个结点为红颜色
    private static final int GREEN = 2;//标志一个结点为绿颜色
    private int[] color;//结点颜色
    private boolean valid;//是否是二分图

    public boolean isBipartite(int[][] graph) {
        int n = graph.length;//结点个数
        valid = true;//初始认为当前图是二分图
        color = new int[n];//结点颜色初始都是无颜色
        Arrays.fill(color, UNCOLORED);
        for (int i = 0; i < n && valid; ++i) {//如果已经确定不是二分图,可以提前退出
            if (color[i] == UNCOLORED) {//如果无颜色,就进行深度优先遍历操作
                dfs(i, RED, graph);//第一个结点都从红色开始赋值
            }
        }
        return valid;//
    }

    public void dfs(int node, int c, int[][] graph) {
        color[node] = c;
        int cNei = c == RED ? GREEN : RED;//和c相反的颜色,例如c是红色,c的邻居cNei就必须是绿色
        for (int neighbor : graph[node]) {//获取其邻居
            if (color[neighbor] == UNCOLORED) {//如果是第一次上色
                dfs(neighbor, cNei, graph);//进行上色(与c相反)
                if (!valid) {//如果已经确定不是二分图,直接返回
                    return;
                }
            } else if (color[neighbor] != cNei) {//如果已经有颜色了,但是和当前结点的颜色c一样
                valid = false;//破坏了邻居颜色不一样的规则,不是二分图
                return;
            }
        }
    }
}

广度优先

解题思路:时间复杂度O( n + m n+m n+m),n是顶点个数,m是边的数量,空间复杂度O( n n n),保存每个顶点的颜色信息
  1. 将深度优先改为广度优先即可
  2. 但是因为使用了队列,根本上还是和深度优先一样的逻辑。肯定没有深度优先遍历直接底层用系统的栈空间快
  3. 实际工作场景的差别不大,但是做题嘛,1ms都能拉开很大差距。所以能深度优先深度优先遍历
代码

在这里插入图片描述

class Solution {
    private static final int UNCOLORED = 0;//无颜色
    private static final int RED = 1;//红色
    private static final int GREEN = 2;//绿色
    private int[] color;//颜色

    public boolean isBipartite(int[][] graph) {
        int n = graph.length;//顶点个数
        color = new int[n];//每个顶点颜色,默认无色
        // Arrays.fill(color, UNCOLORED);
        for (int i = 0; i < n; ++i) {//遍历每个顶点
            if (color[i] == UNCOLORED) {//如果无色
                Queue<Integer> queue = new LinkedList<Integer>();//对其进行广度优先
                queue.offer(i);//广度优先
                color[i] = RED;//第一个为红色,邻居为绿色
                while (!queue.isEmpty()) {//广度优先遍历其邻居
                    int node = queue.poll();//出队列其本身
                    int cNei = color[node] == RED ? GREEN : RED;//与其不同色,为邻居应有颜色
                    for (int neighbor : graph[node]) {//访问其邻居
                        if (color[neighbor] == UNCOLORED) {//如果没有访问过
                            queue.offer(neighbor);//广度优先
                            color[neighbor] = cNei;//赋值不同色
                        } else if (color[neighbor] != cNei) {//已经访问过,但是和当前顶点颜色一样
                            return false;//不是二分图
                        }
                    }
                }
            }
        }
        return true;//整个图都满足邻居颜色不同,就是二分图
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/530277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​如何使用 ArcGIS Pro 制作带贴图建筑

对于用GIS软件制作三维建筑&#xff0c;很多时候都是制作的建筑体块&#xff0c;这里为大家介绍一下怎么使用 ArcGIS Pro 制作带贴图的建筑&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的建筑数据&#xff0c;除了建筑数据&#xff0c;常见…

Simple_SSTI_2

Simple_SSTI_2 破解思路 1、启动场景2、用kali的tplmap扫一下 1、启动场景 http://114.67.175.224:18040/ 然后机会发现 页面啥也不是&#xff0c;查看源码后&#xff0c;看了好像又没看 2、用kali的tplmap扫一下 安装tplmap【已安装,可略过】&#xff1a;在kali终端安装git…

GitHub 仓库 (repository) Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub 仓库 [repository] Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clo…

A Learning-Based Approach for IP Geolocation

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:185 Abstract 定位IP主机地理位置的能力对于在线广告和网络攻击诊断等应用程序是非常吸引力的。虽然先前的方…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;&#xff0c;然后在文本元素中使用clear属性来清除浮动&#xff0c;以确保文字不会覆盖图片。另外&am…

React路由快速入门:Class组件和函数式组件的使用

1. 介绍 在开始学习React路由之前&#xff0c;先了解一下什么是React路由。React Router是一个为React应用程序提供声明式路由的库。它可以帮助您在应用程序中管理不同的URL&#xff0c;并在这些URL上呈现相应的组件。 2. 安装 要在React应用程序中使用React路由&#xff0c;…

使用pytorch构建控制生成GAN(Controllable GAN)网络模型

本文为此系列的第四篇Controllable GAN&#xff0c;上一篇为Conditional GAN。文中使用训练好的模型和优化噪声向量来操纵生成图像的特定属性&#xff0c;若有不懂的无监督知识点可以看本系列第一篇。 原理 本文主要讲什么是控制生成&#xff0c;以及如何做到控制生成。 什么是…

设计模式学习笔记 - 设计模式与范式 -行为型:7.责任链模式(下):框架中常用的过滤器、拦截器是如何实现的?

概述 上篇文章《6.责任链模式&#xff08;上&#xff09;&#xff1a;原理与实现》&#xff0c;学习了职责链模式的原理与实现&#xff0c;并且通过一个敏感词过滤框架的例子&#xff0c;展示了职责链模式的设计意图。本质上来说&#xff0c;它跟大部分设计模式一样&#xff0…

Lvs+keepalived+nginx搭建高可用负载均衡集群,爱了爱了

检查 最后启动nginx服务 135配置虚拟网卡 检查 最后启动nginx服务 Nginx.conf配置如下 关闭132的keepalived服务后 浏览器能正常访问 132在keepalived配置中加入脚本 脚本内容 132清除ipvsadm中的规则,vip不见 133收到vip 自我介绍一下&#xff0c;小编13年上海交大毕业&…

React ant 点击导航条闪烁

问题 : 点击当前位置会出现闪一下的效果 另一种点击方式 , 不会闪 原因 : 没有传递具体的参数给点击事件 , 导致在函数内部无法准确判断要展示哪个子菜单&#xff0c;可能导致页面状态的短暂变化&#xff0c;出现闪烁效果 代码 : // 左侧子菜单弹出const showSonMenu routeK…

【前端】学习路线

1、基础 1.1 HTML 菜鸟教程-主页&#xff1a;https://www.runoob.com/ 可以学习&#xff1a;HTML、CSS、Bootstrap等 1.2 CSS 《通用 CSS 笔记、建议与指导》 1.3 JavaScript 1&#xff09;入门&#xff1a;JavaScript 的基本语法 2&#xff09;进阶&#xff1a;现代 …

hive管理之ctl方式

hive管理之ctl方式 hivehive --service clictl命令行的命令 #清屏 Ctrl L #或者 &#xff01; clear #查看数据仓库中的表 show tabls; #查看数据仓库中的内置函数 show functions;#查看表的结构 desc表名 #查看hdfs上的文件 dfs -ls 目录 #执行操作系统的命令 &#xff01;命令…

JVM—垃圾收集器

JVM—垃圾收集器 什么是垃圾 没有被引用的对象就是垃圾。 怎么找到垃圾 引用计数法 当对象引用消失&#xff0c;对象就称为垃圾。 对象消失一个引用&#xff0c;计数减去一&#xff0c;当引用都消失了&#xff0c;计数就会变为0.此时这个对象就会变成垃圾。 在堆内存中主…

SRNIC、选择性重传、伸缩性、连接扩展性、RoCEv2优化(六)

参考论文SRDMA&#xff08;A Scalable Architecture for RDMA NICs &#xff09;&#xff1a;https://download.csdn.net/download/zz2633105/89101822 借此&#xff0c;对论文内容总结、加以思考和额外猜想&#xff0c;如有侵权&#xff0c;请联系删除。 如有描述不当之处&…

【MATLAB高级编程】第二篇 | 元胞数组(cell)操作

【第二篇】元胞数组&#xff08;cell&#xff09;操作 1. 创建元胞数组cell2. 查看和修改cell内的元素值3. 高级操作: 可视化作图显示cell内的内容4. 把矩阵转换成单元数组5. 把单元数组转换成结构体变量 你好&#xff01; 欢迎进入 《MATLAB高级编程》 文章系列 &#xff0c;每…

物理服务器与云服务器的租用对比

​ 物理服务器&#xff1a;每个基于 Web 的应用程序都依赖于一个服务器&#xff0c;该服务器提供网络中的数据存储&#xff0c;并可根据请求提供给客户端。例如&#xff0c;用户使用浏览器访问 Web 应用程序。服务器可确保托管客户端可以使用该硬件组件。与其他托管可能性相比&…

云平台和云原生

目录 1.0 云平台 1.1.0 私有云、公有云、混合云 1.1.1 私有云 1.1.2 公有云 1.1.3 混合云 1.2 常见云管理平台 1.3 云管理的好处 1.3.1 多云的统一管理 1.3.2 跨云资源调度和编排需要 1.3.3 实现多云治理 1.3.4 多云的统一监控和运维 1.3.5 统一成本分析和优化 1.…

基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 Lipschitz李式指数定义与性质 4.2 Lipschitz李式指数的估计 4.3 Lipschitz李式指数在信号特征识别与故障检测中的应用 5.完整程序 1.程序功能描述 基于Lipschitz李式指数的随机信号特…

Mac的终端配置

Mac的终端配置 参考教程包管理工具 - Homebrew出现的问题用虚拟环境解决方案&#xff1a;直接将解释器的路径放过去错误方法&#xff1a;用find查找到虚拟环境安装的路径&#xff0c;其链接的是brew安装的python路径 编辑器没有报错&#xff0c;但是运行过程中仍然找不到pandas…

联想电脑开启虚拟化失败,开启虚拟化却提示还没有开启虚拟化

安装虚拟机的时候&#xff0c; 电脑要开启虚拟化&#xff0c; Intel VT&#xff0c; 去BIOS开启了&#xff0c; 但是依然报错&#xff0c;说虚拟化处于禁用状态。 解决方案&#xff1a; 去联想官方&#xff0c;下载BIOS更新包&#xff0c;更新BIOS。 更新文档&#xff1a; 联…