二分图算法总结 C++实现

总体概念

图源ACWING

染色法

基本思路步骤

  1. 将所有的边及其相接的边用邻接表存储起来;
  2. 遍历所有的点,找到未上色的点;
  3. 用BFS将该点及其相接的点迭代上色;
  4. 在上述染色步骤中,如果相邻点的颜色相同则无法形成二分图;

题目

图源ACWING

题解

在这里插入图片描述
原链接:https://www.acwing.com/solution/content/105874/

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010 * 2;//因为是无向图,所以每两个点之间的边要存储两次
int e[N], ne[N], idx;//邻接表存储图
int h[N];
int color[N];//保存各个点的颜色
int n, m;//点和边void add(int a, int b)//邻接表插入点和边
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}bool dfs(int u, int c)//深度优先遍历
{color[u] = c;//u的点成 c 染色//遍历和 u 相邻的点for(int i = h[u]; i!= -1; i = ne[i]){int j = e[i];                   if(!color[j])//相邻的点没有颜色,则递归处理这个相邻点{if(!dfs(b, 3 - c)) return false;//(3 - 1 = 2, 如果 u 的颜色是2,则和 u 相邻的染成 1)//(3 - 2 = 1, 如果 u 的颜色是1,则和 u 相邻的染成 2)}else(color[j] == c)//如果已经染色,判断颜色是否为c{                                     return false;//如果是,说明冲突,返回                   }}return true;
}int main()
{memset(h, -1, sizeof h);//初始化邻接表cin >> n >> m;for(int i = 1; i <= m; i ++)//读入边{int a, b;scanf("%d%d", &a, &b);add(a, b), add(b, a);}for(int i = 1; i <= n; i ++)//遍历点{if(!color[i])//如果没染色{if(!dfs(i, 1))//染色该点,并递归处理和它相邻的点{cout << "No" << endl;//出现矛盾,输出NO return 0;}}}cout << "Yes" << endl;//全部染色完成,没有矛盾,输出YESreturn 0;
}作者:Hasity
链接:https://www.acwing.com/solution/content/105874/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

匈牙利算法

基本思路步骤

  1. 邻接表存储边;
  2. 遍历左侧的点,接着遍历与其相连的在右侧点(二分图点被划分为左右两侧);
  3. 找到未连过其他点的点与其相连;
  4. 如果该点已经连接,尝试让连接这个点的左侧的点重新连接其他点;

题目

图源ACWING

具体题解

在这里插入图片描述
原链接:https://www.acwing.com/solution/content/179030/

代码实现

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N = 510, M = 1e5 + 10;int h[N], e[M], ne[M], idx;//邻接表储存边
int match[N];//match[i] = j表示与点i相连的点是j;是记录整个过程配对情况的数组;
bool st[N];//遍历到左侧一个点时,判断右侧的点是否被该点访问过了;是记录一次循环的访问情况的数组;
int n1, n2, m;
int res;//结果集void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx ++ ;
}bool find(int x)
{for(int i = h[x];i != -1;i = ne[i])//遍历与点x相连的点{int j = e[i];if(!st[j])//如果没有被x访问过{st[j] = true;//将其标记为true,防止重复访问;if(match[j] == 0 || find(match[j]))//如果该点没有与其他点配对过 或者 与该点配对的点能找到其他的点与其配对;{match[j] = x;return true;}}}return false;
}int main()
{cin >> n1 >> n2 >> m;memset(h, -1, sizeof h);int a, b;while(m -- ){scanf("%d%d", &a, &b);add(a, b);}for(int i = 1;i <= n1;i ++ ){memset(st, false, sizeof st);//每次访问右侧的点时,需将st全赋值为false防止被上次循环的find影响本次find的访问;if(find(i)){res ++ ;}}cout << res;return 0;
}

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

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

相关文章

继电保护之电压重动、电压并列和电压切换

实践&#xff1a;以某开关室10kV母联隔离柜为例&#xff1a; ZYQ-824为PT并列装置&#xff0c;装置内包含一系列继电器&#xff0c;用于PT重动及并列。按照装置编号原则&#xff0c;交流电压切换箱一般命名为7n。 ​下图为装置内继电器线圈部分接线&#xff1a; 下图为装置内…

销售秘籍:故事+观点+结论

在销售的浩瀚宇宙中&#xff0c;隐藏着一个不朽的秘诀——利用人类共有的“错失恐惧”&#xff0c;激发客户内心的渴望与行动。正如村上春树所言&#xff0c;每个故事都深深植根于灵魂&#xff0c;而大仲马则揭示&#xff0c;灵魂之眼所见&#xff0c;比肉眼更为长久铭记。 错…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 1 部分:Elastic Serverless Forwarder

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 这是多部分博客系列的第一部分&#xff0c;探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 Elasticsearch 提供了多种从 AWS S3 存储桶导入数据的选项&#xff0c;允许客户根据其特定需求和架构策略选择最合适的方…

Mysql锁机制解读(敲详细)

目录 锁的概念 全局锁 表级锁 表锁 元数据锁 意向锁 锁的概念 全局锁 表级锁 表锁 元数据锁 主要是对未提交事务&#xff0c;修改表结构造成表结构混乱&#xff0c;进行控制。 在不涉及表结构变化的情况下,元素锁可以忽略。 意向锁 避免有行级锁影响加表级锁&#xff0…

YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV9模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…

​.NET一款反序列化执行命令的白名单工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

Unity_Obfuscator Pro代码混淆工具_学习日志

Unity_Obfuscator Pro代码混淆工具_学习日志 切勿将密码或 API 密钥存储在您附带的应用程序内。 混淆后的热更新暂时没有想到怎么办 Obfuscator 文档 https://docs.guardingpearsoftware.com/manual/Obfuscator/Description.html商店链接Obfuscator Pro&#xff08;大约$70&a…

sqli-labs靶场第三关less-3

sqli-labs靶场第三关less-3 1、确定注入点 http://192.168.128.3/sq/Less-3/?id1 http://192.168.128.3/sq/Less-3/?id2 有不同回显&#xff0c;判断可能存在注入&#xff0c; 2、判断注入类型 输入 http://192.168.128.3/sq/Less-3/?id1 and 11 http://192.168.128.3/sq/L…

Nginx07-静态资源访问

零、文章目录 Nginx07-静态资源访问 1、Nginx解决跨域问题 &#xff08;1&#xff09;同源策略 同源策略&#xff08;Same-Origin Policy&#xff09;是一个关键的网络安全概念&#xff0c;由Netscape公司在1995年引入&#xff0c;现在被所有现代浏览器所采用。它限制了从一…

每日一题|871. 最低加油次数|动态规划、内层逆序遍历

题目分析&#xff1a;找到第一个能够实现当前油量能够行驶的最大距离大于等于目标距离&#xff0c;且加油次数最小的加油站和加油次数。 每次加油之后能够行驶的最大距离都是由上一次加油的距离决定的&#xff0c;因此使用dp。 1、dp数组定义 dp[i]是一个一维数组&#xff0…

毕业设计项目 深度学习安全帽佩戴检测(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师…

keras yolo8目标检测

是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车&#xff0c;卡车&#xff0c;交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…

JVM 内存区域 堆

堆是JVM中相当核心的内容&#xff0c;因为堆是JVM中管理的最大一块内存区域&#xff0c;大部分的GC也发生在堆区&#xff0c;那接下来就让深入地探究一下JVM中的堆结构。 需要明确&#xff0c;一个JVM实例只存在一个堆内存&#xff0c;堆区在JVM启动的时候就被创建&#xff0c…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题&#x1f6a9;题意与思路 ⭐返回贪心&#x1f6a9;原理&#xff08;反悔池&#xff09;&#x1f6a9;落实到题&#x1f6a9;AC code ⭐练习题⭐END&#x1f31f;交流方式 ⭐例题 经典例题&#xff1a; 871. 最低加油次数 &#x1f6a9;题意与思路 题意&#xf…

MATLAB与R语言在建模中的合作与应用(下篇)

目录 目录 模型训练的协同使用 1. 使用 R 语言进行统计建模 2. 使用 MATLAB 进行机器学习建模 模型评估与调优 1. 在 R 中评估模型性能 2. 在 MATLAB 中进行模型优化 实战示例&#xff1a;MATLAB 与 R 的协同建模 总结 在上篇文章中&#xff0c;我们介绍了 MATLAB 和 R…

2024兴国专转本长期集训产品发布!

9月13日&#xff0c;兴国教育2024长期集训产品发布会在江苏南京顺利召开。 成立于2002年的兴国品牌&#xff0c;时至今日&#xff0c;已经走过了二十二年。兴国新媒体发言人祁老师在发布会上&#xff0c;为大家介绍了兴国这二十年来的变化。 截至2024年8月&#xff0c;兴国在全…

论文阅读:Split-Aperture 2-in-1 Computational Cameras (二)

Split-Aperture 2-in-1 Computational Cameras (一) Coded Optics for High Dynamic Range Imaging 接下来&#xff0c;文章介绍了二合一相机在几种场景下的应用&#xff0c;首先是高动态范围成像&#xff0c;现有的快照高动态范围&#xff08;HDR&#xff09;成像工作已经证…

ctf.bugku - 本地管理员

题目来源&#xff1a;本地管理员 - Bugku CTF 访问页面 页面的最后返回一个字符串&#xff1b; 结尾 应该是base64 编码&#xff1b; 解码得到 test123 同时&#xff0c;提示信息还有 IP禁止访问&#xff0c;本地管理员登陆&#xff1b; 所以&#xff0c;请求头添加&#x…

【AI知识点】残差网络(ResNet,Residual Networks)

残差网络&#xff08;ResNet&#xff0c;Residual Networks&#xff09; 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构&#xff0c;在深度学习领域取得了巨大的成功。它通过引入残差连接&#xff08;Residual Connection&#xff09; 解决了深层神经网络中…

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…