二分图的判定-染色法

二分图

如果一张无向图的N个节点可以分成A.B两个不相交的非空集合,并且同一集合内的点之间没有边相连,那么称该无向图为二分图(BipartiteGraph)。
定理:二分图不存在奇环(长度为奇数的环)。
因为每一条边都是从一个集合走到另一个集合,只有走偶数次才可能回到同一个集合。
在这里插入图片描述

染色法

我们可以使用染色法来判定二分图。即尝试用两种颜色标记图中的节点.当一个点被标记后,所有与它相邻的节点应该标记与它相反的颜色,若标记过程产生冲突,则说明图中存在奇环。可以用DFS或BFS来实现。

算法流程

1.color[]初始化为0,被访问的点的颜色是1或-1。
2.进入u,对u点染色。
3.枚举u的邻点V,

(1)若v未访问,走进去,若返回有奇环,则一路返回有奇环。
(2)若v已访问且v的颜色与u的颜色相同,则返回有奇环。

4.枚举完u的邻点,没有发现奇环,则返回没有奇环。

代码如下:

#include<iostream> 
using namespace std;const int N = 5005; // 最大节点数
const int M = 5005; // 最大边数int n, m; // 节点数和边数struct edge
{int v, ne; // 目标节点和下一条边的索引
} e[M]; // 边数组int h[N], idx; // 邻接表头指针数组和边数组索引
int color[N]; // 节点颜色数组// 添加一条从节点 a 到节点 b 的无向边
void add(int a, int b)
{e[++idx] = { b, h[a] }; // 将节点 b 插入节点 a 的邻接表头部h[a] = idx; // 更新节点 a 的邻接表头指针
}// 深度优先搜索判断是否存在二分图,并进行节点染色
bool dfs(int u, int c)
{color[u] = c; // 将当前节点染色为 cfor (int i = h[u]; i; i = e[i].ne) // 遍历以节点 u 为起点的所有边{int v = e[i].v; // 取得当前边的目标节点 vif (!color[v]) // 如果节点 v 还未被染色{if (dfs(v, -c)) // 递归调用 dfs 染色节点 v,颜色为 -c{return true; // 如果存在冲突,返回 true}}else if (color[v] == c) // 如果节点 v 已经染色且颜色与当前节点相同{return true; // 存在冲突,返回 true}}return false; // 没有冲突,返回 false
}int main()
{cin >> n >> m; // 输入节点数和边数for (int i = 0; i < m; i++) // 循环读入每条边的信息{int a, b;cin >> a >> b; // 输入边的两个节点add(a, b); // 添加无向边 a->b 和 b->aadd(b, a);}bool flag = false; // 是否存在二分图的标志for (int i = 1; i <= n; i++) // 遍历所有节点{if (!color[i]) // 如果节点 i 还未染色{if (dfs(i, 1)) // 对节点 i 进行染色,从第一种颜色开始{flag = true; // 如果存在冲突,设置标志为 truebreak;}}}if (flag) // 如果存在冲突,输出 NO{cout << "NO" << endl;}else // 如果不存在冲突,输出 YES{cout << "YES" << endl;}return 0; // 程序正常结束
}

使用vector容器和queue队列

#include <iostream>
#include <vector>
#include <queue>
using namespace std;const int N = 100005; // 最大节点数
vector<int> adj[N]; // 邻接表
int color[N]; // 节点颜色数组bool isBipartite(int n) {queue<int> q;for (int i = 1; i <= n; ++i) {if (color[i] == 0) { // 如果节点未被染色q.push(i); // 将当前节点入队color[i] = 1; // 染色为第一种颜色while (!q.empty()) {int u = q.front();q.pop();for (int v : adj[u]) {if (color[v] == 0) { // 如果相邻节点未被染色color[v] = -color[u]; // 染成与当前节点不同的颜色q.push(v); // 将相邻节点入队}else if (color[v] == color[u]) { // 如果相邻节点与当前节点颜色相同return false; // 不是二分图}}}}}return true; // 所有连通分量都是二分图
}int main() {int n, m; // 节点数和边数cin >> n >> m;for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;adj[u].push_back(v);adj[v].push_back(u); // 无向图,需要双向连接}fill(color, color + n + 1, 0); // 初始化节点颜色数组if (isBipartite(n)) {cout << "YES" << endl; // 是二分图}else {cout << "NO" << endl; // 不是二分图}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

构建宠物咖啡馆:SpringBoot框架的实现策略

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

malloc(0)

malloc(0) 在操作系统底层的实现涉及内存分配管理的多个方面。下面是对 malloc(0) 的实现原理的详细解释&#xff1a; 1. 内存分配管理 操作系统通过内存管理子系统来处理内存分配请求&#xff0c;包括 malloc 函数。内存分配通常使用以下几种策略&#xff1a; 堆管理&#…

卫星测绘AI技术-立哥尖端科研

分布式微波干涉测绘卫星是以多颗满足一定编队构形的卫星为平台&#xff0c;以合成孔径雷达 和高精度星间相对状态测量设备等为有效载荷&#xff0c;具备全天时、全天候获取雷达干涉影像数 据&#xff0c;快速测制全球数字表面模型、数字雷达正射影像等测绘产品能力的卫星系统…

论文解析三: D2-Net 用于联合描述和检测局部特征的可训练CNN

目录 1.D2-Net摘要2.D2-Net关键点介绍3. Joint Detection and Description (联合检测和描述)3.1 Feature Extraction3.2 Feature Detection3.2.1 Hard feature detection &#xff08;硬特征检测&#xff09;3.2.1 Soft Feature Detection&#xff08;软特征检测&#xff09; 3…

BUU刷题-Pwn-jarvisoj_typo(ARM符号表恢复技术,Rizzo,FLIRT)

解题所涉知识点&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;栈地址&#xff1a;libc地址&#xff1a;BSS段地址&#xff1a; 劫持程序执行流程&#xff1a;ARM_ROP 获得shell或flag&#xff1a;调用程序中的system 题目类型&#xff1a; ARM_Pwn arm32 …

Spring Boot 学习之路 -- Thymeleaf 模板引擎

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码框架基于 Spring Boot&#xff0c;后端对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门…

Docsify基础配置

一、激活加载动画 轻松修改index.html文件&#xff1a;<div id"app">内容加载中&#xff0c;请稍候...</div>二、设定文档标题与Github链接 <script>window.$docsify {name: 王涵的博客文档,repo: http://baidu.com,} </script>效果展示&…

需求7———通过一个简单的小需求来理清修改后端的思路

我今天下午刚刚完成了睿哥早上说的几个小问题&#xff0c;现在距离下班时间还有两个小时&#xff0c;已经没啥可干的了&#xff0c;然后我发现我之前做的很多需求还没有写文章来总结&#xff0c;所以现在趁着有空&#xff0c;我先写一下总结。这么多需求中&#xff0c;我挑了一…

【leetcode】238.除自身以外数组的乘积

由于该题不能使用除法&#xff0c;所以参考题解写一个左右乘积列表的方法 创建两个新的数组pef,suf 一个用于记录从左到右的乘积&#xff08;类似于动态规划的思想&#xff09;pef 另一个记录从右到左的乘积 bsuf&#xff08;注意suf是从右到左进行累乘&#xff09; 而pef的最左…

【3dgs】3DGS**(3D Geometry Sensing)与 **NeRF**(Neural Radiance Fields)对比

以下是 3DGS&#xff08;3D Geometry Sensing&#xff09;与 NeRF&#xff08;Neural Radiance Fields&#xff09;对比表格&#xff1a; 更加详细的资料&#xff0c;轻参考&#xff1a; NERF/3DGS 对比维度3DGS (3D Geometry Sensing)NeRF (Neural Radiance Fields)基本原理…

Linux之shell详解(Linux Shell Detailed Explanation)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高&#xff0c;资源占用少&#xff0c;对于翻译要求不高的应用场景可以使用&#xff0c;比如单词&#xff0c;简单句式的中英文翻译。 该示例使用的模型下载地址&#xff1a;【免费】Helsinki-NLP中英文翻译本…

浙江大学机试试题合集(2)

🍰🍰🍰hello宝子们,今天我们继续来练习浙江大学的机试题目。加油!fighting!( •̀ ω •́ )✧ 21🍩1696 Ambulance Dispatch 给定一张城市地图,上面有所有的救护车调度中心(救护车派遣中心) 并标记所有拾取点。你应该写一个程序来处理紧急呼叫。假设来电者正在某个…

得物App荣获“科技创新服务示范案例”,推动品质消费新升级

备受瞩目的2024年中国国际服务贸易交易会在北京盛大开幕&#xff0c;这一由商务部和北京市政府联合举办、并获得世贸组织、联合国等国际组织支持的国家级、国际性、综合型服务贸易盛会&#xff0c;再次吸引了全球的目光。作为上海科技企业的优秀代表&#xff0c;得物App亮相此次…

为什么Linux系统下的程序无法在Windows下运行

两个系统的格式不同&#xff0c;格式就是协议&#xff0c;是在固定位置有意义的数据。Linux下可执行文件格式是elf&#xff0c;可使用readelf查看elf文件头 而Windows下的可执行程序是PE格式&#xff0c;是一种可执行文件。 还有一点是Linux下和Win下系统API不同&#xff0c;这…

Stable Diffusion最新版nowebui的api使用详解

最近在使用stable diffusion最新版的Stable Diffusion WebUI Forge进行api调用,下面来一步一步的进行展开吧!!! 1、下载lllyasviel/stable-diffusion-webui-forge GitHub - lllyasviel/stable-diffusion-webui-forgeContribute to lllyasviel/stable-diffusion-webui-for…

Vxe UI vue vxe-table 实现表格单元格选中功能

Vxe UI vue vxe-table 实现表格单元格选中功能 在表格中实现鼠标点击任意单元格&#xff0c;选取的功能&#xff0c;通过 mouse-config 配置就可以开启单选功能&#xff0c;多选单元格选取功能需安装插件支持。 代码 参数说明 mouse-config 鼠标配置项&#xff1a; selected&…

基于连续小波变换(CWT)批量生成一维信号的时频图 最终生成30张时频图。生成的图像可用于后续的深度学习分类或其他处理。附详细的说明文档。

Matlab基于连续小波变换&#xff08;CWT&#xff09;&#xff0c;将一维信号批量生成时频图的源代码。此示例中&#xff0c;原始信号data是30*1280的格式&#xff0c;一共30条信号&#xff0c;信号长度为1280。最终生成30张时频图。生成的图像可用于后续的深度学习分类或其他处…

多级代理与提权维权

目录 代理构建FRP介绍下载配置⽂件&#xff1a; sock5代理Venom介绍下载配置 icmpsh介绍下载配置 pingtunnel介绍下载配置 EarthWorm介绍下载使用 权限提升win权限提升常⻅利⽤⼯具 Linux权限提升SUID提权 权限维持win权限维持系统服务后⻔⾃启动⽬录注册表后⻔其他类似隐藏⽤户…

前端vue-配置请求拦截器

1.配置拦截器&#xff0c;记得20行的导出 2.响应拦截器&#xff0c;记得28行的导出 3.拦截器不止可以拦截&#xff0c;还可以添加内容