Hall 定理
基本形式
Hall 定理是一个用于判定二分图是否具有完美匹配的定理。
首先对于二分图
是否具有完美匹配,首先一个最基本的条件就是
Hall 定理则在此基础上给出了一个更强的条件。
首先对于一个点集
即表示
上图中,
Hall 条件用于判断一个二分图是否存在完美匹配。如果对于任意的点集
称此二分图满足 Hall 条件。Hall 定理的表述如下:
二分图
$G(X \cup Y,E)$ 存在完美匹配当且仅当$|X| = |Y|$ 并且满足 Hall 条件。
本文会使用
证明
首先,当
现在来证明必要性。记
尝试使用数学归纳法来证明
注意到满足上述条件的非空真子集
这个时候任意删去图
计算所有满足 Hall 条件的子集
对于一张二分图而言,如何确定
令
考虑到直接枚举子集过于暴力,因此先选择集合中的一个点
大致的代码如下:
1 2 3 4 5 | f = [True] * 2^n // DP数组 for s in [0, 2^n): for u in [0, n): f[s] &= f[s ^ (1 << u)] # 检查s本身是否可行,更新f[s] |
简单运用
Hall 定理一般没有什么优化算法复杂度上的用途,但是可以作为一个比较好的思维工具。
例如下面这个问题:
[Russian Code Cup 2016 - Finals] A. Closing ceremony
大意是有一个
同时定义两个点之间的距离为曼哈顿距离,每个人有自己行走的路程上限。
现在这
令点
设
事实上由于存在单调性,利用 Hall 定理可以知道,我们只用判定是否对于所有的
那么现在的问题就是求得
并且注意到它可以递归计算:
并且需要考虑这两条直线的交点是否会占用一个格子。所以我们的做法就是枚举交点,确定是那两条直线相交,并且赋给对应的