二分图知识

二分图判定

二分图为无奇环的无向图,我们可以对图黑白染色,此时如果出现矛盾,则图不是二分图,否则一定是

那么,黑色的点我们称左部点,白色的为右部点

可能会有问题最后转化为二分图判定,要留心


二分图匹配

这是二分图中常考的应用,有两种算法

算法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$),即可转化为不可重复点的覆盖


二分图应用

未完待续,匹配在求一些特殊图的最大团时有应用

还有很多问题,不过它们一般是有这些特点:

  • 每个只能用指定次数,有多种选择,想让用的次数尽可能多

  • 可以分为两部分,且每部分之间无关

posted @ 2023-03-13 22:44  KellyWLJ  阅读(6)  评论(0编辑  收藏  举报  来源