【C++图论 二分图 DFS】785. 判断二分图|1624

news/2024/12/17 7:10:08/

本文涉及知识点

C++图论
C++DFS

LeetCode785. 判断二分图

存在一个 无向图 ,图中有 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 。
示例 1:
在这里插入图片描述

输入:graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
输出:false
解释:不能将节点分割成两个独立的子集,以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。
示例 2:
在这里插入图片描述

输入:graph = [[1,3],[0,2],[1,3],[0,2]]
输出:true
解释:可以将节点分成两组: {0, 2} 和 {1, 3} 。

提示:
graph.length == n
1 <= n <= 100
0 <= graph[u].length < n
0 <= graph[u][i] <= n - 1
graph[u] 不会包含 u
graph[u] 的所有值 互不相同
如果 graph[u] 包含 v,那么 graph[v] 也会包含 u

DFS

m_ans[i]为0表示未处理,1在A组,2在B组。
DFS(cur),next是cur的临接点,
iGroup = (3-m_ans[cur])
if( iGroup+ m_ans[next] == 3) 则不是二分图

for i = 0 To n-1
if(m_ans[i]>0)continue;
m_ans[i]=1
DFS(i)
由于存在环,所以无法通过父节点除重,需要vis数组避免重复处理,否则就死循环了。不如:用BFS。

代码

核心代码

class Solution {public:bool isBipartite(vector<vector<int>>& graph) {m_vAns.resize(graph.size());m_vis.resize(graph.size());for (int i = 0; i < graph.size(); i++) {if (m_vAns[i] > 0) { continue; }m_vAns[i] = 1;DFS(i, graph);}return m_ans;}void DFS(int cur, vector<vector<int>>& graph) {if (m_vis[cur]) { return; }m_vis[cur] = true;for (const auto& next : graph[cur]) {const int iGroup = 3 - m_vAns[cur];if (iGroup + m_vAns[next] == 3) { m_ans = false; }m_vAns[next] = iGroup;DFS(next, graph);}}bool m_ans = true;vector<int> m_vAns;vector<bool> m_vis;};

核心代码

	vector<vector<int>> graph;TEST_METHOD(TestMethod1){graph = { {0},{2,3},{1,3},{1,2} };auto res = Solution().isBipartite(graph);AssertEx(false, res);}TEST_METHOD(TestMethod11){graph = { {1,2,3},{0,2},{0,1,3},{0,2} };auto res = Solution().isBipartite(graph);AssertEx(false, res);}TEST_METHOD(TestMethod12){graph = { {1,3},{0,2},{1,3},{0,2} };auto res = Solution().isBipartite(graph);AssertEx(true, res);}TEST_METHOD(TestMethod13){graph = { {},{2,4,6},{1,4,8,9},{7,8},{1,2,8,9},{6,9},{1,5,7,8,9},{3,6,9},{2,3,4,6,9},{2,4,5,6,7,8} };auto res = Solution().isBipartite(graph);AssertEx(false, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.ppmy.cn/news/1555801.html

相关文章

onlyoffice 请求代理后的地址后续请求会重定向到80端口问题

问题描述&#xff1a; onlyoffice 服务是3333本机端口和80 docker容器端口 我需要在nginx服务器上代理到86端口的/oo/路径上 问题配置如下&#xff1a; server {listen 86;location /oo/ {proxy_pass http://192.168.199.129:3333/;} }这样配置出现请求重定向到80端口现象 最后…

threejs 建筑设计(室内设计)软件 技术调研之二 墙体材质改变

运用threejs 开发 建筑设计&#xff08;室内设计&#xff09;软件 技术调研 二 墙体材质改变 在线体验地址&#xff1a;http://47.96.130.245:8080/design/index.html 实现功能&#xff1a; 左键点击开始画线&#xff0c;右键结束画线&#xff0c;画线结束后&#xff0c;生成…

package.json中版本管理的标识有哪些

在 package.json 文件中&#xff0c;版本管理的标识符用于指定依赖包的版本范围。以下是常见的版本管理标识符及其含义&#xff1a; 精确版本&#xff1a; "dependencies": {"example-package": "1.2.3" }只安装指定的 1.2.3 版本。 波浪号 (~)…

解决Vue项目中npm install卡住问题的详细指南

解决Vue项目中npm install卡住问题的详细指南 引言 在开发Vue项目时&#xff0c;我们经常会遇到npm install命令卡住的问题&#xff0c;特别是在构建依赖树时。本文将分享一些实用的解决方案&#xff0c;帮助您快速解决这一常见问题。 问题描述 在执行npm install时&#xf…

ChatGPT生成测试用例的最佳实践(二)

这种测试用例还不够直观&#xff0c;能不能让其以表格的形式显示呢&#xff1f;笔者输入“请以表格形式展示&#xff0c;谢谢。”提示词&#xff0c;ChatGPT输出的部分内容如图3-3所示。 图3-3 ChatGPT输出的部分内容 以下为ChatGPT生成的关于百度关键字搜索的测试用例集&…

每天40分玩转Django:Django表单

Django表单 一、今日学习内容概述 学习模块重要程度预计学时表单基础与创建⭐⭐⭐⭐⭐1.5小时表单验证机制⭐⭐⭐⭐⭐2小时CSRF保护机制⭐⭐⭐⭐⭐1.5小时表单渲染与处理⭐⭐⭐⭐1小时 二、Django表单基础知识 Django的表单处理是Web应用程序中最重要的部分之一&#xff0c…

Ansible 简介及常用命令 安装部署tomcat -单机版

Ansible 是一个开源的自动化配置管理工具&#xff0c;用于应用程序部署、任务执行和多节点管理。它的目标是简化和自动化 IT 基础设施管理和配置工作。通过使用 Ansible&#xff0c;系统管理员可以有效地管理数以百计的服务器&#xff0c;而无需依赖复杂的脚本或安装额外的代理…

ISP帳戶會記錄什麼資訊?

許多用戶並不知道ISP會記錄有關線上活動的大量資訊。從流覽歷史記錄到數據使用情況&#xff0c;ISP經常收集和保留用戶數據&#xff0c;引發一系列隱私問題。 ISP 記錄哪些數據&#xff1f; ISP可以根據其隱私政策記錄各種類型的資訊。常見的記錄數據包括&#xff1a; 1.流覽…