leetcode判断二分图

判断二分图

图的问题肯定要用到深度优先遍历或者广度优先遍历,但又不是单纯的深度优先遍历算法和广度优先遍历算法,而是需要在遍历的过程中加入与解决题目相关的逻辑。

题干中说了,这个图可能不是连通图,这个提示有什么作用呢?

很多时候我们接触的题目,图都是连通的,对于连通图来说,从一个点开始遍历,不管是深度优先还是广度优先,遍历一遍就可以把图中的所有点都遍历到;而对于非连通图来说,从一个点开始遍历,就无法将所有点都遍历一遍,这就需要针对每个点都进行一次遍历。


不管使用深度优先遍历算法还是使用广度优先遍历算法,都要实时记录结果,如果当前已经确定了不是连通图,那么说明结果已经确定了,就不需要继续判断,直接返回就可以。因为已经判断不是连通图,那么再继续判断下去没有意义,不是连通图的情况已经确定;如果在判断过程中,一直是连通图,那么还有没有遍历到的点,还是需要继续遍历的,因为剩下的点可能是不连通的。

1 深度优先遍历算法

class Solution {
public:enum Color {kUnColored = 0,kRed = 1,kGreen = 2};// 如果已经确定不是连通图了,就不需要继续遍历了bool isBipartite(vector<vector<int>>& graph) {int size = graph.size();// 图可能是非连通图,所以需要从每个节点开始进行一次遍历for (int i = 0; i < size && result == true; i++) {// 如果这个点没有遍历到,那么才需要遍历,已经遍历到的不需要继续遍历if (dataColor[i] == Color::kUnColored) {dfsScanGraph(graph, i, Color::kRed);}}return result;}void dfsScanGraph(vector<vector<int>> &graph, int const node, Color const color) {if (result == false) {return;}dataColor[node] = color;const Color line_color{color == Color::kRed ? Color::kGreen : Color::kRed};//给node连接的这一行的节点染色for (int data : graph[node]) {if (result == false) {return;}// 1、如果与node颜色相同,那么这两者属于同一个区域,可以确定不是二分图// 2、如果这个点还没有染色,那么进行递归染色,颜色与node不同的颜色// 3、如果节点已经染色,并且与node颜色不同,那么不做处理if (dataColor[data] == color) {result = false;return;} else if (dataColor[data] == Color::kUnColored){dfsScanGraph(graph, data, line_color);  }}}private:int dataColor[101] = {0};bool result = true;
};

2 广度优先遍历算法

class Solution {
public:enum Color {kUnColored = 0,kRed = 1,kGreen = 2};bool isBipartite(vector<vector<int>>& graph) {int size = graph.size();for (int i = 0; i < size && result == true; i++) {if (dataColor[i] == Color::kUnColored) {// 广度优先遍历需要使用一个队列来辅助// 每一次广度优先遍历,都使用一个新的,空的队列std::queue<int> queue;bfsScanGraph(graph, i, Color::kRed, queue);}}return result;}void bfsScanGraph(vector<vector<int>> &graph, int const data, Color const color,std::queue<int> &queue) {if (result == false) {return;}dataColor[data] = color;queue.push(data);while (!queue.empty()) {int head_data = queue.front();queue.pop();const Color another_color{dataColor[head_data] == Color::kRed ? Color::kGreen : Color::kRed};for (int line_data : graph[head_data]) {if (result == false) {return;}if (dataColor[line_data] == Color::kUnColored) {dataColor[line_data] = another_color;queue.push(line_data);} else {// 这里比较的对象与深度优先遍历中比较的是不一样的// 深度优先比较的对象是node,广度优先比较的对象是出队的head_data// 两者的相同点,比较的对象都是与这一行的行首进行比较,行首表示这与当前这个节点是临接点if (dataColor[line_data] == dataColor[head_data]) {result = false;return;}}}}}private:int dataColor[101] = {0};bool result = true;
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shared_ptr 线程安全

为什么 shared_ptr 可以安全地在多个线程中共享&#xff1f; 循环引用 因为shared_ptr std::shared_ptr 的引用计数是线程安全的。这意味着你可以在多个线程中安全地拷贝、赋值和销毁 std::shared_ptr。然而&#xff0c;访问或修改 shared_ptr 所指向的对象时&#xff0c;需要…

昇思25天学习打卡营第20天|LSTM+CRF序列标注

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) LSTMCRF序列标注 概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标…

明日周刊-第15期

赶在周末结束前输出一把&#xff0c;周日的晚上大家要睡个好觉哦。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 科技创新与基础设施建设 深中通道正式通车试运营 时间&#xff1a;6月30日 内容&#xff1a;国家重大工程深中通道正式通车试运营&#xff0c;标志着珠江口东…

吉时利KEITHLEY KI-488驱动和说明

吉时利KEITHLEY KI-488驱动和说明

[吃瓜教程]南瓜书第6章支持向量机

0.补充知识 0.1 超平面 定义&#xff1a; 超平面是指在&#x1d45b;维空间中&#xff0c;维度为 &#x1d45b;−1的子空间。它是分割空间的一个平面。 性质&#xff1a; n维空间的超平面 ( w T x b 0 , 其中 w , x ∈ R n ) (w^Tx_b0,其中w,x\in \mathbb R^n) (wTxb​0,其…

通过端口转发实现docker容器运行时端口更改

通过端口转发实现docker容器运行时端口更改 前言启动容器查看容器ip地址端口转发 前言 关于修改docker正在运行中容器端口&#xff0c;网上大部分分为3类: 1. 删除原有容器重新创建;2. 改配置文件;3. 在现有容器上新提交镜像&#xff0c;用新镜像起新的容器。 1和3属于同一种流…

探讨4层代理和7层代理行为以及如何获取真实客户端IP

准备工作 实验环境 IP角色192.168.1.100客户端请求IP192.168.1.100python 启动的HTTP服务192.168.1.102nginx服务192.168.1.103haproxy 服务 HTTP服务 这是一个简单的HTTP服务&#xff0c;主要打印HTTP报文用于分析客户端IP #!/usr/bin/env python # coding: utf-8import …

「技术分享」FDL对接金蝶云API取数

很多企业的ERP系统都在用金蝶云星空&#xff0c;金蝶云星空API是IT人员获取数据的重要来源&#xff0c; 常常用来生成定制化报表&#xff0c;进行数据分析&#xff0c;或是将金蝶云的数据与OA系统、BI工具集成。 通常情况下&#xff0c;IT人员需要使用Python、Java等语言编写脚…

44、tomcat安装

一、tomcat tomcat和php一样&#xff0c;都是用来处理动态页面的。 tomcat也可以作为web应用服务器&#xff0c;开源的。 php .php tomcat .jsp nginx .html tomcat 是用Java代码写的程序&#xff0c;运行的是Java的web应用程序。 tomcat的特点和功能&#xff1a; 1、s…

XSS平台的搭建

第一步&#xff1a;安装MySQL 数据库 因为xss平台涉及到使用mysql 数据库&#xff0c;在安装之前&#xff0c;先使用docker 安装mysql 数据库。 docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD123 -d -i -p 3309:3306 mysql:5.6 第二步&#xff1a;安装xssplatform…

hadoop分布式中某个 节点报错的解决案例

前言 在分布式节点中&#xff0c;发现有个节点显示不可用状态&#xff0c;因此需要紧急修复。 hadoop版本 目前这套集群hadoop的版本如下&#xff1a; 集群报错详细日志&#xff1a; 1/1 local-dirs are bad: /kkb/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/tempDatas/n…

离线开发(VSCode、Chrome、Element)

一、VSCode 扩展 使用能联网的电脑 A&#xff0c;在VSCode官网下载安装包 使用能联网的电脑 A&#xff0c;从扩展下载vsix扩展文件 将VSCode安装包和vsix扩展文件通过手段&#xff08;u盘&#xff0c;刻盘 等&#xff09;导入到不能联网的离线电脑 B 中 在离线电脑 B 中安装…

快速解决找不到krpt.dll,无法继续执行代码问题

对于那些遇到计算机开机出现由于无法找到krpt.dll&#xff0c;进而无法继续执行代码问题的用户。 krpt.dll是计算机系统中与DirectX紧密相关的重要文件&#xff0c;如果它出现问题&#xff0c;可能会对一些特定的软件或游戏的运行产生影响。实际上&#xff0c;我们有多种解决该…

无需服务器,浏览器跑700+AI模型?!【送源码】

Transformers.js 是一个创新的网络机器学习库&#xff0c;它将先进的 Transformer 模型直接带入浏览器&#xff0c;无需服务器端支持。这个库与 Hugging Face 的 Python transformers 库功能对等&#xff0c;提供相似的 API 接口来运行预训练模型&#xff0c;涵盖了自然语言处理…

mysql signed unsigned zerofill详解

灵感来源 mysql中有符号signed&#xff0c;无符号unsigned与零填充zerofill UNSIGNED 无符号UNSIGNED是一个属性&#xff0c;你可以在创建或修改表时为整数类型的列指定它。无符号属性意味着该列只能存储非负整数&#xff08;0和正整数&#xff09;&#xff0c;而不是默认的有…

docker部署onlyoffice,开启JWT权限校验Token

原来的部署方式 之前的方式是禁用了JWT&#xff1a; docker run -itd -p 8080:80 --name docserver --network host -e JWT_ENABLEDfalse --restartalways onlyoffice/documentserver:8 新的部署方式 参考文档&#xff1a;https://helpcenter.onlyoffice.com/installation/…

C9联盟是什么?

九校联盟&#xff08;C9 League&#xff09;&#xff0c;简称C9联盟&#xff0c;是中国首个顶尖大学间的高校联盟&#xff0c;于2009年10月正式启动。 其成员都是国家首批“985工程”重点建设的一流大学&#xff0c;包括北京大学、清华大学、哈尔滨工业大学、复旦大学、上海交通…

c++ primer plus 第15章友,异常和其他:15.2.2模板中的嵌套

c primer plus 第15章友&#xff0c;异常和其他&#xff1a;15.2.2模板中的嵌套 15.2.2模板中的嵌套 文章目录 c primer plus 第15章友&#xff0c;异常和其他&#xff1a;15.2.2模板中的嵌套15.2.2模板中的嵌套程序清单15.5 queuetp.h程序清单15.6 nested.cpp 15.2.2模板中的…

五.RocketMQ理论及常见问题处理方案

RocketMQ的架构理论及底层原理 一&#xff1a;生产消息1.消息生产过程2.Queue选择算法 二&#xff1a;存储消息2.1存储介质2.2消息的存储和发送2.3消息存储结构2.4刷盘机制 三&#xff1a;消费消息1 获取消费类型2 消费模式3 Rebalance机制4.Queue分配算法 四&#xff1a;消息清…

html+css+JavaScript 实现两个输入框的反转动画

开发时遇到了一个输入框交换的动画 做完之后觉得页面上加些许过渡或动画&#xff0c;其变化虽小&#xff0c;却能极大的提升页面质感&#xff0c;给人一种顺畅、丝滑的视觉体验。它的实现过程主要是通过css中的transition和animation来实现的。平时在开发的时候增加一些动画效…