Descripition
设一张二分图两部点数为 ((x,y),x<y),则其的一个完备匹配定义为 左部 (x) 个点成为匹配点
特别地,当 (x=y) 时,这类匹配也被称为完备匹配
一个如上定义的二分图存在 完备匹配 的充要条件是对于左部点的大小为 (k) 的任意子集 (S),这些点在右部连到的点集(也被称为 (S) 的邻域,记为 (N(S)))大小不小于 (k)
Proof
首先证明必要性,如果一个点集的 (N(S)) 不足 (|S|),那么该集合并不能找到一个完备匹配,与定义相反
其次是充分性,考虑使用归纳的手段,这部分分两种情况:
-
如果存在一个严格子集 (S) 满足 (S=N(S)),则子集本身存在完备匹配
如果删去 (S,N(S)) 后出现不满足条件的集合 (T),那么在原二分图中取子集 (Scup T),必然有 (|N(Scup T)|<|Scup T|),与题设矛盾
那么由此证明如果存在 (|S|=|N(S)|),( m{Hall}) 定理成立
-
如果所有子集的 (|N(S)|) 均大于 (|S|),那么找到一个点 (u) 并找到 ((u,v)in E),删掉 (u,vin V,(u,* ), (* ,v)in E)
不难发现此时剩下的二分图每个子集 (S) 都能满足 (|N(S)|ge |S|),而且因为删掉了一个点,问题是原问题的子问题
根据归纳假设,( m{Hall}) 定理在此情况下也成立
例题
CF1519F
对于所有子集 (S),均需满足下式:
那么把每个箱子和锁拆成 (a_i,b_i) 个点,每个箱子上每个点向每个锁的每个点连边
设箱子对应的点为左部点,若满足其有完美匹配,则上式成立
那么状压 (DP) 可以很好的解决这个问题:设 ( m{dp(i,S)}) 表示考虑了前 (i) 个箱子后,右部点 每个锁剩下的点数为 (S)
这里 (S) 使用五进制表示,实现每次暴力编码解码即可
转移考虑枚举当前箱子拆出来的点匹配右边的哪种点,匹配几个,注意产生匹配就要付出代价,但是只用付出一次
用 ( m{dfs}) 实现转移是容易的
合法状态并不能让复杂度达到 (Theta(n imes 5^{2n})) 的上界,但是朴素 ( m{dfs}) 过了??
ARC076F
本题需要 ( m{Hall}) 定理的一个推论:一个任意二分图 ((V,E)) 的最大匹配为 (|V|-maxlimits_{Sin V}{|S|-|N(S)|})
该推论可能可以通过增广路和匈牙利算法理解
问题即求解 (maxlimits_{Sin V}{|S|-N(S)})
发现对于一个特定的点集 (x),其结果就是 (|S|-maxlimits_{iin S} L_i-(m+1-minlimits_{iin S} R_i))
使用数据结构维护扫描线容易完成