二分图知识
二分图判定
二分图为无奇环的无向图,我们可以对图黑白染色,此时如果出现矛盾,则图不是二分图,否则一定是
那么,黑色的点我们称左部点,白色的为右部点
可能会有问题最后转化为二分图判定,要留心
二分图匹配
这是二分图中常考的应用,有两种算法
算法1:匈牙利算法
思想:
它的核心是每次贪心找到一条增广路
增广路指走的路径从非匹配边开始,匹配边与非匹配边交错,最后从左部点走到右部点,以非匹配边结尾的一条路径。
走完后将匹配与非匹配边反转,发现匹配边多了一条
形象理解就是让走到的已匹配的人尝试换组匹配,可以比作大家都挪一挪位置,让新的人有位置坐好像不是很恰当
这里每层进入 dfs 时只会从左部点开始,match[i]
记录右部点 $i$ 的匹配的左部点
要分清楚,每次只能从左部点开始 dfs,如果图混合标号,还要先染色一遍
时间复杂度:最劣 $O(nm)$(虽然一般远远跑不满)
它的时间复杂度不太优秀,不过有个很重要的性质:已经匹配的点不会失配,因此可以做到有匹配的优先级
代码:
算法2:dinic 跑网络流
建图:
$S$ 向左部点连一条容量为 $1$ 的边,左部点向右部点如果有边则连容量为 $1$ 的边,右部点向 $T$ 连容量为 $1$ 的边
直接跑网络流,所得的最大流即为最大匹配数
代码:
时间复杂度:$O(n\sqrt m)$
因为网络流的灵活性,它可以更高效的处理拓展的匹配问题
比如,匹配一对会有权值,在最大匹配的情况下求最大/小权值,此时把左部点连向右部点的边带上费用,跑最大/小费用最大流
又比如说,一个点可以匹配多次,那就更改它连向源点/汇点的流量
二分图性质
定理1:
二分图中,最大匹配数 = 最小点覆盖数 = n - 最大独立集
最大独立集:图中选出的点集两两没有边
最小点覆盖数:图中选出的点集,每条边都至少有一个端点在点集中
定理2:
DAG 中,最大独立集 = 最小链(路径)覆盖数 = n - 拆点二分图的最大匹配数
注意,这里的最小链覆盖数,是每条链不能有重复点的,要用这些链覆盖所有顶点,一个点算一条链
拆点二分图就是把图中每个点拆为 2 个,左部一个右部一个,从 $u\to v$ 右边即把左部的 $u$ 和右部的 $v$ 连边
那如果允许重复点呢?
此时用 floyd $O(n^3)$ 的对图传递闭包(如果 $a\to b$,$b\to c$ 则 $a\to c$),即可转化为不可重复点的覆盖
二分图应用
未完待续,匹配在求一些特殊图的最大团时有应用
还有很多问题,不过它们一般是有这些特点:
-
每个只能用指定次数,有多种选择,想让用的次数尽可能多
-
可以分为两部分,且每部分之间无关