【补习时间】二分图相关学习笔记

本文介绍了二分图的概念及其在图论中的重要性质,包括最大匹配、最小点覆盖和最小路径覆盖等。重点讨论了二分图最大匹配的匈牙利算法,解释了增广路的定义及其在寻找最大匹配中的关键作用,并概述了Hopcroft-Karp算法作为优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人弱现在才学二分图

————————————–线割分是我>w<————————————————–
二分图的定义:如果一个图G=(V,E),满足图的所有顶点可以被划分至两个不想交的集合,且边集E中的每条边连接的两个顶点都分属两个集合,则这个图满足是二分图.
对于一个二分图,可记为 G=(V1,V2,E) .
二分图的判定:
判定一个图是二分图的充要条件:图G的顶点数大于等于2,且图的所有环的长度均为偶数.
小学生百科上是这么写的..
真要写代码验证黑白染色一下就可以了…

然后是一些其他的相关定义(以下定义不只在二分图内有,在一般图内也存在)
图的匹配:选定一组边集,使得选定的边两两没有公共点,则这个边集称为图的一个匹配.
对于所有的匹配方案,边数最多的那个方案称为这个图的最大匹配.
对于带权二分图,存在一种匹配方案使得该匹配权值和最大,这个匹配方案称为该图的最大权匹配.
对于一个已定的匹配方案,在匹配中的边我们称为匹配边,当然相应的就有了非匹配边.
对于已选匹配边的端点,我们称为匹配点,其他的称为非匹配点或者未盖点.
存在一种方案,满足我们选择最少的点使得任意一条边至少有一个端点被选择,这个选择点的方案称为最小点覆盖.
有Konig定理,为:图的最小点覆盖数=图的最大匹配数

对于一个DAG,我们选择最少的路径使图的每个顶点属于且仅属于一条路径(此处路径长度可以为0,即为一个点),这个路径选择方案称为最小路径覆盖.(有向图拆点构建二分图)
此处又有 最小路径覆盖数=N - 最大匹配数.

在图中选一些点,使得这些点两两间均不存在边直接相邻,点数最多的方案称为最大独立集.

一个独立集,满足选出点的点权和最大,为最大点权独立集.
有 最小割=最小点权覆盖集=点权和-最大点权独立集

对于一个选定的点集构成的子图,如果任意两点间都直接有边相连,则称这个选定点集构成的图为一个完全子图又叫一个.

顶点数最大的完全子图称为原图的最大完全子图,顶点数目称为最大团.又有 最大团顶点数目=原图的补图的最大独立集顶点数目

槽…这一期怎么这么多概念QAQ

接下来真的真的真的是正文了!
关于二分图最大匹配的求法:
通常来说二分图的最大匹配有两种求法:匈牙利算法和Dinic.

先来学一下匈牙利算法.

在学匈牙利算法之前,有一个重要的定理和一些概念需要知道(又是概念T_T):
对于图G中的一条简单路径P,如果满足P的起点和终点都是未盖点且P上匹配边和非匹配边交替出现,则路径P为一条增广路.
对于仅满足交替出现一条的路径,称为交替路径.
显然对于一条增广路,它的起始边和终止边都是非匹配边,那么我们把这条路径上的匹配边变成非匹配边,非匹配边变成匹配边,匹配依然合法,且匹配大小变成了原匹配+1.
也就是说,我们每次的增广,都是一个扩充匹配点集合和匹配边集合的过程.
因此不难发现一个定理:
增广路定理:一个匹配M是图G的最大匹配,充要条件是图G中不存在增广路.这个定理适用于任意一个图.
我们来证明一下(膜拜了Delayyy的论文后自己总结的证明):
如果图G中还有增广路,根据上面我们推理的如果存在一条增广路匹配就能+1,所以此时M一定是G的最大匹配.必要性得证.
那么接下来是充分性.
如果存在一个更大的匹配M’,我们定义M和M’的对称差为一个图D,图D中的匹配边为M的匹配边加上M’的匹配边除掉M.M’的公共匹配边.
显然D中点的度数最多为2,且这种点直接相连的两条边分别属于M,M’.这说明D由一坨环和一坨链组成(其实我觉得就是一棵仙人掌…)
同时这个仙人掌满足其中所有的环上,M的边和M’的边是交替出现的,因此这些环长度都是偶数.这样的环是一个交替环,在这样的环中属于M的边的数目和属于M’的边的数目是一样的.
既然数目一样,那么除掉这些环剩下的链中属于M’的边的数目一定大于属于M的边的数目,因此对M来说一定还存在增广路.
也就是说只要有更大的匹配,就一定还有增广路出现,充分性得证.

知道了这些原理之后,匈牙利算法的实现看起来就非常简单了,枚举每个点,如果是未盖点,增广一次.增广一次的复杂度是O(E)的,所以总复杂度显然是O(VE)的,正确性也显而易见.

然而这个看起来不那么优美的复杂度显然无法满足一些题目的要求…
于是我们还有两个选择:Dinic 和 Hopcroft-Karp算法.
由于我之前从没学过Dinic更没写过,我也懒得去学一遍了…想学的话遍地都是嘛╮(╯▽╰)╭

所以接下来学一下Hopcroft-Karp吧!

严格的来说HK并不能算是一个新的算法,可以算是对匈牙利算法的一个优化.
我们尝试不是一次只找到一条增广路径,而是同时进行多个增广路径,同时满足每个增广路不相交.
需要注意的是不是随便找几个增广路就行了,要求每次进行增广的必须是一个最短增光路集,且这个集合是极大的.
可以证明,这种情况下增广次数是 O(n)

我懒得证了T_T
有兴趣的话自己看看这个证明吧

具体实现就是,每次增广前先BFS一遍打上距离标号,找到第一个未盖点时,把这个距离设置为上限,这样以后显然我们找到的所有未盖点距离相等.
然后选取未盖点,DFS沿距离标号下降的方向找增广路.这些未盖点DFS的总时间是O(m)的.
然后因为可以证BFS最多 O(n) 次,所以总复杂度是 O(nm) 的.

代码模板以后放.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值