二分图与网络流
二分图概念与判定
定义:对于无向图 ,若存在将 划分成两个不相交子集 的方案,使得 的点导出子图都不含边,则称 为二分图, 为 的两部。
这即是说, 。
由此,我们也可以用二染色来定义二分图:二分图是可以被二染色的图。
这里存在一个小性质:若二分图 包含 个连通分量,则其二染色的方案为 ,这是因为每个连通分量恰有两种染色方法。
二分图的性质:
定理:图 为二分图,当且仅当 中不存在长度为奇数的圈。
证明:
若 中存在长度为奇数的圈,设环上点依次为 ,使得 与 为邻居(),考虑这个环的二染色情况,易知 同色,则 和 是一对相邻的同色点,不符合二染色的定义,故必要性得证。
当 中不存在长度为奇数的圈时,考虑每一个连通分量,以任意点为根求出一棵生成树,由于不存在奇环,所以任一条非树边连接的两个顶点深度不同奇偶,考虑将所有深度为奇数的点染为黑色,深度为偶数的点染为白色,这就得到了一种二染色方案,故充分性得证。
推论:二分图 的任意子图为二分图。
推论:无向图 是二分图当且仅当其每个连通分量都是二分图。
二分图的判定定理:
根据上面的定理和证明过程,我们可以得到判定给定无向图是否是二分图的算法:
- 设给定的图为 ,由第二条推论,只需分别判定 的每个连通分量是否是二分图。
- 对于 中的一个连通分量,对其进行 ,求出一棵搜索树并记录每个点的深度,遇到返祖边时,判定这条边两端点的深度是否同奇偶,如果同奇偶则 不是二分图,若对于所有返祖边都有两端点深度不同奇偶,则 是二分图。
- 在实现时,只需要记录每个点深度的奇偶性,事实上这等价于模拟对 进行二染色的过程。
- 时间复杂度为 。
事实上,结合上面的过程还可以得到一些比较显然的小结论:例如连通图 不是二分图当且仅当对于任意生成树 都存在恰好包含一条非树边的奇环,这些结论应该更贴近连通性方面的知识了。
二分图有关路径长度的浅显性质: 二分图中任意两点间路径经过的边数奇偶性确定,反之,一个连通非二分图中任意两点间路径经过的边数奇偶性都不确定。
例题 :[Luogu P1330] 封锁阳光大学
给定无向图 ,求最小的点集 使得 有 或 恰好成立其一,或报告无解。
容易发现,若存在这样的 ,则 是以 和 构成两部的二分图,因此若 不是二分图则无解。
当 是二分图时,考虑到每个连通分量的独立性,对每个连通分量分别考虑,将其二染色后取点数较少的一边加入 中,点数较多的一边加入 中即可。
时间复杂度为 。
例题 :[NOIP 2010] 关押罪犯
有 个罪犯和两座监狱,罪犯间有 对形如 的关系表示 两名罪犯若在同一监狱则会发生影响力为 的冲突事件,求合理分配每个罪犯到某一座监狱后,发生的最大影响力的冲突事件的影响力最小值。
二分答案 ,考虑所有影响力关系 ,建立 的无向图 ,则所有冲突事件影响力都能不大于 当且仅当 是二分图,判定之。
时间复杂度为 。
例题 :[HNOI 2019] 校园旅行
给定无向图 ,每个点有 或 的一个标记,有 组询问,每组询问给定 ,你需要求出是否存在一条 的路径 ,使得路径经过的点的标记拼成一个回文串。
考虑一个由标记全为 或标记全为 的点构成的大小不小于 的连通分量,若 经过了这个连通分量,则我们可以在 中任意增添 个这种标记(只需选择一条边来回经过一下),因此对于这些大小不小于 的连通分量,我们只关心 经过这个连通分量时在路径中增加的 段或 段的长度奇偶性。
当这个连通分量 是二分图时,从一个点到另一个点经过点数的奇偶性是确定的;反之当 不是二分图时经过点数的奇偶性是可变的,因此我们可以缩去这个连通块内的一些边,只需要满足它是否是二分图这一性质不变即可。
如果它是二分图,显然只需要保留一棵生成树即可,否则只需要保留一棵生成树的基础上任意增加一个奇环,例如增加一条自环。
(甚至不必是生成树,任意一个连通二分图均可)
同样的道理,当我们把这样一个连通块视为一个整体时,连接不同连通块的边也可以通过相似的方法缩成只剩一个生成树(由于连通块已经染色,所以肯定是二分图)。
(这一部分只能是生成树,不能是任意一个连通二分图)
可以论证,大小为 的连通分量的存在不会对上述过程的正确性产生影响,因为与之对应的在路径中的对称点也必然只有一个,并不影响(但请注意,这要求我们在缩两侧不同标记的边时保留的是原图 中的生成树,而不是把所有之前的连通块缩成一点后再求生成树)。
此时 ,我们考虑一个 的 算法,以 这样的路径和 且 是相邻的同标记点这样的路径为起点不断向两侧扩展即可。
时间复杂度为 。
二分图最大匹配
二分图最大匹配问题,即对于给定的二分图 ,求出大小最大的边集 使得 中不存在两条共端点的边。
匈牙利算法
我们下面将介绍求解二分图最大匹配的匈牙利算法。
令 是一个匹配,其中的边称为匹配边,匹配边的端点称为匹配点,如果一条路径从一个未匹配的左部点出发到达一个未匹配的右部点,交替经过不在 中的边和在 中的边,则称该路径为一条增广路。
匈牙利算法依赖一个重要结论: 是二分图的最大匹配,当且仅当图中不存在增广路。
必要性容易证明:若存在增广路,则将增广路上全体非匹配边改为匹配边,匹配边改成非匹配边,就得到了一组更大的匹配。
充分性证明:若 不是最大匹配,设最大匹配为 ,显然存在左部点 不在 中而在 中,假设在 中它匹配了 ,若 在 中是非匹配点,那么我们已经找到了一条增广路 ,否则对 在 中匹配的点重复上述过程,则我们或者得到一条增广路,或者得到了一个增广路删去一条边的结构,将其中所有边取反,可以将 调整为一个和 更为“接近”的最大匹配,不断执行此过程,若一直未找到增广路,最后 ,说明 是最大匹配,矛盾。
upd 一个更严谨的充分性证明:考虑一个最大匹配 ,求出 的对称差 (是一个边导出子图),由于 是匹配,所以 中所有点度数不大于 ,因此 是由若干环和若干链组成的,如果 比 小,那么对称差中属于 的部分就要更多,而对于环和偶链来说二者所占边数相等,所以必定有一个奇链,即增广路。
上面充分性的证明已经部分蕴含了匈牙利算法的内容:
-
枚举 ,其中 为左部点数量,时刻维护左部点当前前缀 与全体右部点的一组最大匹配 ,考虑将 加入:
-
以 为端点进行 寻找增广路,假设寻找以左部点 开始的增广路,首先枚举 的邻居 ,若 是非匹配点或者从 匹配的点出发存在增广路,那么我们就找到了一条以 开始的增广路(对于前者,,对于后者, );
-
如果找到了一条增广路,答案增加 ;
-
为了控制算法复杂度,在对于每个 寻找增广路时,如果从一个 出发时寻找失败,下次就可以直接返回,如果从一个 的匹配点出发时寻找失败,下次也不必再检查 。
匈牙利算法基于贪心原则:一旦一个点进入匹配,就不会重新成为非匹配点,因此当找不到增广路时表示 在保持 的匹配情况不变时一定无法加入最大匹配中。
由此,我们可以知道:若将匹配的左部点记为 ,未匹配的左部点记为 ,则按照枚举顺序拼接左部点的匹配情况,匈牙利算法求出的最大匹配是字典序最大的。
二分图匹配和匈牙利算法的一种组合理解
简单说说二分图匹配和匈牙利算法的一种组合理解:
考虑从拟阵交的角度刻画二分图最大匹配问题,令 , 的子集 为满足导出子图中所有左部点度数不超过 的边集, 为满足导出子图中所有右部点度数不超过 的边集,下面证明 和 为拟阵:
以 为例,这里直接采用定义的方法证明:
- 显然,;
- 遗传性:显然若 ,则对于 有 ;
- 交换性:若 ,,任取 到处子图中一个度数为 而在 导出子图中度数为 的点,将其对应的边加入 中,仍然在 中。
那么匹配就是 和 的交了,要求最大匹配,即 与 的拟阵交问题。
回想拟阵交中的扩展过程,我们维护当前最大交 ,每次选择一条路径 ,使得 且 ,其实这就是匈牙利算法中寻找的增广路的边集。
例题 :[NOI 2009] 变换序列
给定数列 ,求字典序最小的排列 使得 。
考虑建立二分图,左右部各有 个点,左边的点 向右边的点 和 连边,则一种完美匹配对应了一种合法的 。
本题的匹配比较特殊,去除所有一度点后形成了若干个环,每个环只有两种完美匹配,尝试字典序小的一种即可。
二分图最大匹配还可以用来解决一些其他模型。
二分图最小点覆盖
最小点覆盖问题指的是在给定图中选择尽量少的点,使得每条边至少有一个点被选。
我们考虑将二分图最大匹配写成线性规划形式,每条边视作变量,每个点视作限制:
其中 表示 是否是边 的一个端点。
我们可以证明:上面问题中的代价矩阵是一个全幺模矩阵,因此其最优解等于整数规划解,即 ,这说明了我们用线性规划描述二分图匹配的合理性。
(因为证明过程比较复杂,这里不写了,需要注意的是,若是一般图匹配则此处矩阵不是全幺模矩阵。)
将其对偶:
也就是说每条边的两个端点中至少要选一个,这也就是最小点覆盖问题了。
根据强对偶定理,我们可以得到:
定理:二分图最小点覆盖大小等于最大匹配大小。
随后,我们给出一种最小点覆盖的构造方法:
- 在求完最大匹配后,从二分图的每个左部未匹配点出发进行一次寻找增广路,然后将途径的所有点设为已经过标记。
- 取左侧所有未标记点和右部所有标记点,它们构成一组点覆盖。
- 下面证明这是一组点覆盖:如果存在一条边两端都没有选,说明其左侧是标记点,右侧是非标记点,但是在那个左侧点被标记后,右侧的点随后就会被经过,所以这是不可能的。
- 下面证明这组点覆盖的大小等于最大匹配大小:对于每条匹配边,或者左侧右侧同时被标记,或者同时没被标记,因此必定恰有一个点被选;而对于一条非匹配边,假设左侧点不是匹配点,那么必然被标记,假设右侧点不是匹配点,那么必然不被标记(否则找到了一条增广路),因此只有所有匹配边的恰好一边在这组点覆盖中。
实际上,我们还容易证明任何一组点覆盖大小 任何一组匹配大小,根据上面的构造,也可以得到定理。
二分图最大独立集
最大独立集问题指的是在给定图中选择尽量多的点,使得其导出子图不含边。
对于任何一张无向图,我们有如下定理成立:
定理:最大独立集大小与最小点覆盖大小之和等于点数。
这是因为任何一组独立集取补后就得到一组点覆盖,独立集与点覆盖是一一对应的。
所以在二分图中我们就有:
定理:二分图最大独立集大小与最大匹配大小之和等于点数。
例题 :
求在 棋盘上最多放置多少个不会互相攻击的骑士。
对于格子 ,如果 则作为左部点,否则作为右部点,在每一对可以互相攻击的格子间连边,此二分图的最大独立集即为答案。
值得注意的是,许多类似的棋盘问题都可以用黑白染色的方法转化成二分图相关的问题。
与本题类似还有 Luogu P5030 之类,注意每题的染色方法可能不同。
二分图最小边覆盖
最小边覆盖的定义类似最小点覆盖,即用最少的边覆盖所有的点。
如果不存在孤立点,则二分图最小边覆盖等于最大独立集大小,即总点数减去最大匹配大小。
首先,最大独立集中任何两个点一定不能由一条边覆盖,因此最小便覆盖不小于最大独立集。
再构造一种方案:选出所有匹配边,再对于所有未匹配点单独选一条和它相连的边,就得到了一组等于最大独立集的边覆盖,因此结论得证。
二分图最小边覆盖
最小边覆盖的定义类似最小点覆盖,即用最少的边覆盖所有的点。
如果不存在孤立点,则二分图最小边覆盖等于最大独立集大小,即总点数减去最大匹配大小。
首先,最大独立集中任何两个点一定不能由一条边覆盖,因此最小便覆盖不小于最大独立集。
再构造一种方案:选出所有匹配边,再对于所有未匹配点单独选一条和它相连的边,就得到了一组等于最大独立集的边覆盖,因此结论得证。
有向无环图最小路径覆盖
考虑如下问题:给定简单 ,我们要选出其中数目最小的不相交的路径,使得每个点至少在一条路径上。
设给定的有向图为 ,构造二分图 ,左右各 个点,如果 ,则将左边的点 与右边的点 连边,有:
定理: 的最小路径覆盖大小等于 减去 的最大匹配大小。
证明:
考虑建立两者之间的对应关系:
- 对于 的一个路径覆盖,对于其中某条路径 ,在 中选出 的边,因为路径间不相交,所以每个点入度和出度都不超过 ,因此选出的边构成匹配;
- 对于 中的一组匹配,同上可以构造 的一个路径覆盖,注意没有边经过的点都视为被一条空路径经过。
在上面的对应过程中,每增加 匹配中的一条边,就有多一条边选入路径覆盖中,而初始视为有 条路径,每次合并两条,所以合并了 次则最小路径覆盖大小就是 。
例题 :[CTSC 2008] 祭祀
给定简单有向无环图 ,求最大的 使得 ,不存在 到 的路径。
这是一个非常经典的问题。
一个熟知结论是:将 传递闭包后得到一个偏序集,即如果 可达 则记 ,显然这确实是个偏序集。
根据 定理,偏序集的最长反链长度等于最小链划分大小,在传递闭包 上即为:如果选出的满足题目条件的点集 ,则不存在 条路径可以覆盖 中所有点。
因此答案就是传递闭包后的最小路径覆盖大小。
二分图最大权匹配
对于给定二分图 ,每条边有一个权值 ,我们想要找出一组匹配,使得其中包含的所有边权值和最大,称为二分图最大权匹配。
注意,如果给定的 不包含所有可能的边,那么最大权匹配不一定是最大匹配。
为了求解这个问题,让我们再次借助线性规划工具:
其中 表示边 是否以点 为端点,其实这个问题就是在最大匹配的基础上加上了每条边的权值 。
仍旧将它对偶,得到:
我们将对偶问题中的变量 称为顶点 的顶标,那么问题转化成了:
最小顶标和问题:给定二分图,给每个点一个顶标,使得每条边两端点的顶标和不小于边权,且所有点顶标和最小。
不过,再次我们需要做一些补充:
- 在上面的线性规划证明中,我们要求 ,即边权非负。
- 但是,如果存在 ,那么就不能用上面的方法证明(顶标有可能是负数,不满足线性规划的条件),此时我们可以将所有权值加上一个极大数,最后减掉,但这种方法成立的条件是最大权匹配为完美匹配(或至少为最大匹配),下面的 算法本质上也只能解决这种问题。
接下来我们将介绍 算法, 算法通过解决最小顶标和问题,可以求出给定二分图的一组权值和最大的完美匹配。
在叙述算法过程前,先说说怎么将原先的问题(最大权匹配)转化成最大权完美匹配:
- 如果要求 的最大权匹配,那么我们只需要将所有不存在的边视为边权为 的边,如果左右两部点数不相等则补为相等,就转化成了最大权完美匹配问题;
- 如果要求存在 的最大权完美匹配(当然也可以是权值都非负的),就将不存在的边权值设为 ;
- 如果要求存在 的最大权匹配,那么当然是把所有负权边删掉,变成非负情况。
我们将左部点 的顶标称为 ,右部点 的顶标称为 ,我们要求 ,其中 为 之间的边权(按照上面的方法补全为完全二分图)。
相等子图定义为所有满足 的边构成的子图。
命题:相等子图中若存在完美匹配,则这组完美匹配是原图的一个最大权完美匹配。
证明:考虑这组完美匹配的边权和,根据相等子图定义应当是 ,而对于原图中任意的一组完美匹配,由于 ,所以边权和不超过 ,所以这组完美匹配是最大的。
接下来考虑:如果相等子图中没有完美匹配,尝试通过调整顶标使得相等子图中的最大匹配变大,从而最终形成完美匹配。
假设此时左侧有点 在相等子图的最大匹配中为非匹配点,从 开始尝试在相等子图中寻找增广路(由于是最大匹配了所以必然无法找到),然后我们将访问到的左部点顶标减小 ,右部点顶标增大 ,考虑这样做的影响:
- 对于匹配边,两边必然都访问到或都不访问到,因此 不变,仍然属于相等子图;
- 对于某个以访问到的左部点为一端的非匹配边,由于 减小,有可能被新加入相等子图中。
所以这么做不会影响原先匹配,但可以增加新的边进入相等子图,从而继续增广,而我们只要取 为所有以左部的被访问到的点为一端的边 中最小的 即可,这样至少加进了一条边(但 不能大于这个值,否则不符合顶标的要求)。
于是我们首先任意设定初始合法顶标(如右部点都为 ,左部点都为相连边权最大值),每次加入一个左部点,按照上面要求尝试在相等子图中增广,如果成功则直接增大匹配,否则按照上述过程进行顶标调整,直接实现这一算法就得到了基于 的 算法,复杂度较高。
考虑优化这一算法,我们下面介绍一种 slack 优化的基于 BFS 的 KM 算法。
-
在每次加入一个左部点,尝试增广时,模拟匈牙利算法求增广路的过程,而对于右部每个点 ,记录 表示这一轮已经访问的左侧点 中, 的最小值。
-
当我们访问到一个左部点时,先用它更新所有右部点的 值,接下来我们取出右部 最小的一个点,将其值设为 ,然后将当前已经访问的左部点顶标减小 ,当前已访问的右部点顶标增加 ,并更新 数组(实际上就是每个点的 也需要减小 )。
-
下一个访问的左部点将是刚才取出的右部点的匹配点,这就是一个寻找增广路的过程,而当那个右部点是非匹配点时,我们已经找到了一条增广路。
-
重复上述过程,依次加入所有左部点,最后就求出了最小顶标和问题的解,也就是最大权完美匹配的方案。
例题 :[UVA 1411] Ants
给定平面上 个黑点和 个白点,请选 条线段,每条线段连接一个白点和黑点,每个点只作为一条线段的端点,且这些线段两两不交。
根据简单的初中几何知识,若 ,则 。
所以所求的就是连接黑点和白点的长度和最小的 条线段对应的匹配,直接执行 算法即可。
Hall 定理
对于二分图 ,令 表示与点 相邻的点集,则关于最大匹配,我们有如下结论:
定理:设二分图 的两部分别为 ,且 ,则其存在一个大小为 的匹配当且仅当 ,有 。
证明:
必要性:若存在 使得条件不成立,考虑 中所有点的匹配点,形成了一个大小不小于 的点集,而它们必在 中,这说明一个子集的大小大于超集的大小,这是不可能的。
充分性:若条件成立但不存在大小为 的匹配,则选出左侧一个非匹配点,从其出发进行尝试增广,设访问到的左部点集合为 ,右部点集合为 ,由于无法成功增广则增广过程中的递归终止点必然在 中,考虑递归树,每个 中的点的父结点为 中的点,则有 ,而 应当是 中所有点的 的并,这就与条件矛盾。
Hall 定理有一个简单的推论:
推论:若一个无向图每个点度数都为 ,则称其为 正则图,那么左右点数相等的 正则二分图必有完美匹配()。
证明:
考虑一个左部点集 ,假设其中所有点邻居并 有 ,那么 中所有点的度数和不小于 ,但是 的大小不到 ,所以 中所有点的度数和是 ,因此这是不可能的。
Hall 定理还可以用于点带权值的情况,若左部点 需要匹配 个右部点(可重复),而右部点 可匹配 个左部点(可重复),那么我们只需将定理条件中的 和 分别改成其元素和即可。
我们还可以对此定理进行推广:
Hall 定理推广:设二分图 的两部分别为 ,则其最大匹配为 ,其中 。
证明:
令 。
首先最大匹配不会大于这个数,考虑 取到最大的 ,其中的点的总匹配数不会超过 ,所以整张图的最大匹配数不会超过 。
随后,若最大匹配小于这个数,考虑从左部所有非匹配点出发尝试增广,类似 Hall 定理的证明,可知所有递归过程构成以所有左部非匹配点为根的,所有叶子为左部点的森林,设左部非匹配点有 个,那么这个森林中左右部点个数 满足 ,而 是一个 ,所以左部非匹配点不超过 个。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类