力扣785.判断二分图

存在一个 无向图 ,图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph ,其中 graph[u] 是一个节点数组,由节点 u 的邻接节点组成。形式上,对于 graph[u] 中的每个 v ,都存在一条位于节点 u 和节点 v 之间的无向边。该无向图同时具有以下属性:

  • 不存在自环(graph[u] 不包含 u)。
  • 不存在平行边(graph[u] 不包含重复值)。
  • 如果 v 在 graph[u] 内,那么 u 也应该在 graph[v] 内(该图是无向图)
  • 这个图可能不是连通图,也就是说两个节点 u 和 v 之间可能不存在一条连通彼此的路径。

二分图 定义:如果能将一个图的节点集合分割成两个独立的子集 A 和 B ,并使图中的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,就将这个图称为 二分图 。

如果图是二分图,返回 true ;否则,返回 false 。

和本点有边相连的另一个点肯定是属于另一组的

我们先给一个起始点归到一组

与它直接相邻的点自然就归到另一组。

使用深度优先递归(也可以bfs)如果出现矛盾,即一个点被归到不同组,即错误。

本题可以省掉vis数组,是否遍历和归到哪组可以用一个数组标记

class Solution {
public:bool isBipartite(vector<vector<int>>& graph) {color=vector<int>(graph.size(),0);//color初值都是0,代表都未遍历for (int i = 0; i < graph.size(); ++i) {if (color[i] == 0) {color[i]=1;//把i归到A组,之后开始深度优先遍历bool ret=dfs(i,graph);if(!ret) return false;}}return true;}
private:bool dfs(int src,vector<vector<int>>& graph){int nextColor=color[src]==1?2:1;//根据本点所属的组,决定相邻点的组号for(auto node:graph[src]){if(color[node]==0){//如果相邻点没被遍历过,就继续递归下去color[node]=nextColor;//相邻点归到另一组bool ret=dfs(node,graph);if(!ret) return false;}else if(color[node]!=nextColor)//如果相邻点之前遍历过,且被归到了和本点一样的组,即错误return false;}return true;}vector<int> color;//color数组用来标记是否遍历和归属的组,0是未遍历,1是A组,2是B组
};

力扣特别搞,原本以为从0开始就行,但它的测试点里有0是孤立点的情况,就错了😓

这个题的技巧是深度优先加染色,之前刚好也做到相似的题

力扣802.找到最终的安全状态

有一个有 n 个节点的有向图,节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。

如果一个节点没有连出的有向边,则该节点是 终端节点 。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点 。

返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。

这个题的意思就是从一个点出发的路径不能遇到环。我们也可以使用染色的方法,第一次遇到的时候把该点染成1,表示走过一次,下次如果再遇到就表明走到环了,错误。

如果该点是安全节点,则标记为2,这样方便下次遇到直接利用。

可以先把终端节点标记成2。

class Solution {
public:vector<int> eventualSafeNodes(vector<vector<int>>& graph) {color=vector<int>(graph.size(),0);vector<int> res;for(int i=0;i<graph.size();i++){if(graph[i].empty())//终端节点肯定是安全节点color[i]=2;}for(int i=0;i<graph.size();i++){bool ret=dfs(i,graph);if(ret) res.push_back(i);//安全就加入答案数组}return res;}
private:bool dfs(int src,vector<vector<int>>& graph){if(color[src]>0) return color[src]==2;//如果被遍历过,看是1还是2,1的话说明遇到环了,2表面安全color[src]=1;//遍历过1次,记录为1for(auto node:graph[src]){if(!dfs(node,graph))return false;}color[src]=2;//所有路径都正确,标记为安全节点return true;}vector<int> color;//0未遍历,1遍历过一次,2安全节点
};

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

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

相关文章

Docker构建镜像时空间不足:/var/lib/docker,no space left on device

背景 在一次更新业务服务功能后&#xff0c;重新在服务器上构建微服务镜像&#xff0c;在构建镜像时报错空间不足&#xff1a; /var/lib/docker, no space left on device 赶紧用 df -h 看了下磁盘使用情况&#xff0c;果然&#xff0c; devicemapper 已经满了。。由于需要紧急…

BIM 技术:CIM (City Information Modeling) 1-7 级

本心、输入输出、结果 文章目录 BIM 技术&#xff1a;CIM &#xff08;City Information Modeling&#xff09; 1-7 级前言城市信息模型&#xff08;CIM&#xff09;概述城市信息模型分级介绍CIM 1CIM 2CIM 3CIM 4CIM 5CIM 6CIM 7 花有重开日&#xff0c;人无再少年实践是检验真…

狗dog目标检测数据集VOC+YOLO格式1W+张

狗&#xff0c;是食肉目犬科 [11]犬属 [13]哺乳动物 [12]&#xff0c;别称犬&#xff0c;与马、牛、羊、猪、鸡并称“六畜” [13]。狗的体型大小、毛色因品种不同而不同&#xff0c;体格匀称&#xff1b;鼻吻部较长&#xff1b;眼呈卵圆形&#xff1b;两耳或竖或垂&#xff1b;…

遥感论文 | Scientific Reports | 一种显著提升遥感影像小目标检测的网络!

论文题目&#xff1a;MwdpNet: towards improving the recognition accuracy of tiny targets in high-resolution remote sensing image论文网址&#xff1a;https://www.nature.com/articles/s41598-023-41021-8 摘要 提出MwdpNet&#xff0c;以提高对高分辨率遥感&#xf…

串口通信(6)-C#串口通信Modbus协议完整实例

本文讲解C#基于ModbusRTU协议串口通信完整实例。 前言 关于modbus的协议从上一篇中有介绍,本篇不在阐述。 串口通信(5)-C#串口通信数据接收不完整解决方案 创建实例 添加控件和事件等 参考界面文件 namespace ModbusRTUDemo {partial class MainForm{/// <summary>…

Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11

MacOS通过PD安装Win11 下载ParallelsDesktop安装ParallelsDesktop激活ParallelsDesktop下载Windows11安装Windows11激活Windows11 下载ParallelsDesktop ParallelsDesktop下载地址 安装ParallelsDesktop 关闭上面的窗口&#xff0c;继续操作 激活ParallelsDesktop 关闭上面的…

数据结构之排序

目录 ​ 1.常见的排序算法 2.插入排序 直接插入排序 希尔排序 3.交换排序 冒泡排序 快速排序 hoare版本 挖坑法 前后指针法 非递归实现 4.选择排序 直接选择排序 堆排序 5.归并排序 6.排序总结 一起去&#xff0c;更远的远方 1.常见的排序算法 排序&#xff1a;所…

论文阅读——Semantic-SAM

Semantic-SAM可以做什么&#xff1a; 整合了七个数据集&#xff1a; 一般的分割数据集&#xff0c;目标级别分割数据集&#xff1a;MSCOCO, Objects365, ADE20k 部分分割数据集&#xff1a;PASCAL Part, PACO, PartImagenet, and SA-1B The datasets are SA-1B, COCO panopt…

Centos7 配置Git

随笔记录 目录 1&#xff0c; 新建用户 2. 给用户设置密码相关操作 3. 为新用户添加sudo 权限 4. 配置Git 4.1 配置Git 4.2 查看id_ras.pub 5, 登录Git 配置SSH 秘钥 6. Centos7 登录Git 7. clone 指定branch到本地 8. 将新代码复制到指定路径 9. 上传指定代码 …

maui下sqlite演示增删改查

数据操作类 有分页 todoitemDatabase.cs&#xff1a; using SQLite; using TodoSQLite.Models;namespace TodoSQLite.Data {public class TodoItemDatabase{SQLiteAsyncConnection Database;public TodoItemDatabase(){}// 初始化数据库连接和表async Task Init(){if (Databa…

记录一下github深度学习的错误

1.[visdom]无法正常启动服务问题解决 在Anaconda命令窗口中&#xff1a; 使用python -m visdom.server启动visdom服务时&#xff0c;卡在&#xff1a; Checking for scripts. Downloading scripts, this may take a little while 无法下载和启动服务。 ERROR&#xff1a;由…

Python基础入门第四节,第五节课笔记

第四节 第一个条件语句 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... else: 条件不成立执行的代码1 条件不成立执行的代码2 …… 代码如下: 身高 float(input("请输入您的身高(米):")) if 身高 >1.3:print(f您的身高是{身高},已经超过1.3米,您需…