二分图学习笔记(二分图判定及二分图最大匹配)
二分图判定
定理:一张无向图是二分图,当且仅当途中不存在奇环(长度为奇数的环)。
依据此定理,我们可以用染色法进行二分图的判定。大致思想为:尝试用黑白(c = 0或1)两种颜色标记图中的结点。当一个节点被标记后,它的所有相邻节点被标记为与它相反的颜色(c ^ 1)。若标记过程中产生冲突,则说明图中存在奇环。实现代码如下:
点击查看代码
时间复杂度为
二分图最大匹配
“任意两条边都没有公共端点”的边的集合被称为图的一组匹配。在二分图中,包含边数最多的一组匹配被称为二分图的最大匹配。如果在二分图中存在一条连接两个非匹配点的路径 path, 使得非匹配边与匹配边在 path 上交替出现,那么撑 path 就是这张二分图的增广路。
显而易见,增广路具有两条性质:
- 长度 len 是奇数。
- 路径上第1、3、5、……、len条边是非匹配边,第2、4、6、……、len - 1 条边是匹配边,即匹配边与非匹配边交替出现。
由第二条性质可知,二分图的一组匹配 S 是最大匹配,当且仅当图中不存在 S 的增广路。证明:
反证法: 假设对于二分图的最大匹配 S,图中存在 S 的增广路。
由性质二可知:将增广路上的边取反(原先的匹配边变为非匹配边,原先的非匹配边变为匹配边),则新得到的边集 S' 仍然是一组匹配,且匹配边数比 S 增加了1。故假设不成立。
证毕。
匈牙利算法(增广路算法、月老算法)
匈牙利算法用于计算二分图的最大匹配,其核心思想为不断寻找增广路,并将找到的增广路取反。匈牙利算法的关键也正是在于如何找到一条增广路。代码如下:
点击查看代码
整个实现过程中似乎并没有寻找增广路的过程,但我们经过思考后可以发现,当左部点 x 进行匹配时,有这么两种可能:
- 右部点 y 本身就是非匹配点,此时无向边(x, y ) 本身就是非匹配边,自己能够给构成一条长度为1的增广路。
- 右部点 y 已经与左部点 x' 匹配,但如果从 x'出发能够找到另一个未匹配的右部点 y' 与之相匹配,则路径 x ~ y ~ x' ~ y' 为一条增广路。
如果找不到那就算了
匈牙利算法再是显示采用深搜的框架,递归的从 x 出发寻找增广路。若找到,则在回溯是,中号可以吧路径上的匹配状态取反。另外,可以用全局的 bool 数组标记右部点的访问情况,以防重复搜索。
匈牙利算法的正确性基于贪心策略,即:当一个节点成为匹配点后,最多因找到增广而更换匹配对象,但绝不会再次变回非匹配点。
最后,对于每个左部节点,寻找增广路最多遍历整张二分图一次。因此,匈牙利算法的时间复杂度最差为 ,实际情况下一般 远低于
__EOF__
本文链接:https://www.cnblogs.com/Nebula-Astraea/p/15977806.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探