霍尔定理
霍尔定理
- 原始形式:对于两点集 \(A,B\),设一个 \(A\) 的子集 \(S\) 的邻域为 \(N_S\),则两点集的最大匹配大小为 \(|A|\) 的充要条件是对于任意的 \(S\subseteq A\),均有 \(|N_S|\geq |S|\)。
- 扩展一(不完全匹配):对于两点集 \(A,B\),设一个 \(A\) 的子集 \(S\) 的邻域为 \(N_S\),则两点集的最大匹配大小为 \(|A|-d\) 的充要条件是对于任意的 \(S\subseteq A\),均有 \(|N_S|-d\geq |S|\)。进一步地,一个二分图的最大匹配大小为 \(|A|-\max_{S\subseteq A} (0,|S|-|N_S|)\),此结论与 \(|A|,|B|\) 的大小关系无关。
- 扩展二(一对多匹配):对于两点集 \(A,B\),定义一个 \(x\in A\) 与 \(r_x\) 个 \(y\in B\) 形成一个匹配,则两点集的最大匹配大小为 \(|A|\) 的充要条件是对于任意的 \(S\subseteq A\),均有 \(|N_S|\geq \sum_{x\in S}r_s\)。
- 广义霍尔定理(推广到网络流形式):对于源部点集 \(A\),每个点的流量为 \(a_i\);汇部点集 \(B\),每个点的流量为 \(b_i\),则左部能流满当且仅当对于任意的 \(S \subseteq A\) 均有 \(\sum_{y\in N_S}b_y\geq \sum_{x\in S}a_x\)。
P9339 [JOISC 2023 Day3] Cookies
考虑流模型,每种饼干有 \(a_i\) 的流,每个盒子有 \(cnt_j\) 的流,每种饼干向每个盒子连 \(1\) 的边。考察一个盒子组的合法条件:
- \(\sum_{a_i}=\sum_{cnt_j}\)。
- 盒子一侧流满。由广义霍尔定理知这等价于要求对于任意一个盒子子集 \(S\),有 \(\sum_{j\in S}cnt_j\le \sum_{i=1}^n\min(|S|,a_i)\)。
第二个限制显然落在最大的若干个 \(cnt\) 上。于是考虑从大往小选盒子,设 \(f_{i,j,k}\) 表示前 \(i\) 大的桶,选了 \(j\) 个 \(cnt\),此时和为 \(k\) 是否可行。注意到有限制 \(j\le \frac{tot}{sz_i}\),于是前两维总共是 \(O(n\log n)\)。对第三位上 bitset,复杂度做到 \(O(\frac{n^2\log n}{w})\)。于是可以求出一组合法 \(cnt\),预处理每一个数量对应限制形成的 bitset 即可。
然后把所有的 \(a\) 扔进堆里,从大往小枚举 \(cnt\) 并选择即可构造方案。
[ABC215H] Cabbage Master
流模型显然。根据广义霍尔定理,合法条件是对于任意一个 \(S\subseteq B\),都有 \(\sum_{i\in S}b_i\le \sum_{j\in N_S}a_j\)。考虑枚举邻域 \(N_S\),根据不合法不优,我们可以直接认为左边的最大值就是所有邻域为当前子集的 \(b\) 的和。一遍高维前缀和即可求出最小值 \(ans\)。注意判掉 \(N_S\) 不是任何一个集合的邻域超集的情况。
然后考虑计数。设 \(g_x\) 表示从 \(x\) 集合里选出 \(ans\) 个元素的方案。枚举每一个满足删掉 \(ans\) 个子集内元素就合法的邻域计算方案。问题在于这样会算重。考虑在每一个极小集合处统计答案,设 \(f_S\) 表示 \(S\) 集合中,每种都至少选了一次的方案,容斥可以得到 \(f_S=\sum_{T\subseteq S}(-1)^{S-T}g_T\)。把含有 \(S\) 的部分提出来,后面看成一个整体,可以做高维前缀和得到 \(f\)。最后再做一次高维后缀和即可知道每个集合是否合法。总复杂度 \(O(n2^n)\)。
[AGC037D] Sorting a Grid
通过一些简单推理可以知道 B 的限制是:我们把元素分成 \([1,m],[m+1,2m]\dots\) 共 \(n\) 组,每一组的所有元素在每一列中出现。也即每一列中都有每一组的元素出现。对于每一列,就是某一行与某一组构成完美匹配关系。考虑左部点为 \(n\) 行,右部点为 \(n\) 组,每行内有多少个组内元素就连多少边。此时每个点的度数均为 \(m\)。我们在这个图上跑 \(m\) 次完美匹配,每一次结束后删除匹配边,即可求出每一列的情况。
关于能跑出 \(m\) 次完美匹配的证明:
引理:任意一个所有点度数均相同且不为 \(0\) 的二分图均存在完美匹配。
证明:首先这样的图左右部点必定相同,设度数为 \(d\)。对于任意一个大小为 \(|S|\) 的左点集,其都引出 \(d|S|\) 条边;由于右侧每个点的度数也为 \(d\),故邻域大小至少为 \(|S|\),由霍尔定理知引理成立。
考虑证明一个度数均为 \(d\) 的二分图能跑出 \(d\) 个完美匹配。由引理知至少能跑出一个完美匹配,删去匹配边后变成一个度数均为 \(d-1\) 的二分图,归纳知成立。
P9070 [CTS2023] 琪露诺的符卡交换
考虑在矩阵上交换。注意到矩阵的每一行可以带标号重排,于是变为先重排,后交换。注意到转置操作是一组合法的交换方案,于是目标是重排每一行使得每一列是一个排列,和上面的操作一致。此时每个点的度数均为 \(n\),能跑出来 \(n\) 组最大匹配,故一定有解。网络流即可确定每一组的形态。
P9528 [JOISC2022] 蚂蚁与方糖
把蚂蚁坐标离散化,流模型比较显然。对于蚂蚁集合,能达到邻域上界的集合显然有如下性质:
- 同一个位置的所有蚂蚁一定全部选入。
- 对于三个顺次排列的蚂蚁坐标 \(i,j,k\),若 \(i,k\) 被选择而 \(j\) 未被选择,则一定有 \(k-i>2l\),否则选上 \(j\) 不导致邻域增大。
因此集合一定形如若干个连续区间,每个区间之间的距离超过 \(2l\)。这样每个区间的邻域不交,可单独考虑。根据霍尔定理推论一,设 \(a\) 为一个位置的蚂蚁数量,考虑对每一段容斥邻域,由于是单增一维段,显然只需要加上每一段的邻域和,再减去相邻相交部分的邻域和。我们有如下答案式子:
由于是线段答案,我们类似最大子段和的思想,考虑利用线段树维护区间内左右端点分别选/不选的最大方案和。为了合并方便,我们需要记录相邻两个位置的邻域交。注意到若存在小于 \(2l\) 的区间,则邻域有交,使得算出来的答案偏小,不合法不优,故不必考虑。
修改时,加蚂蚁则可以直接单点修改。否则会对周围 \(2l\) 内的蚂蚁点产生影响,是一个区间修改。注意到仅有左右侧都不选的情况,可能为空,修改后要对 \(0\) 取 \(\max\);其他情况下都对区间产生一个系数为 \(1\) 的贡献。
线段树维护,复杂度 \(O(Q\log Q)\)。

浙公网安备 33010602011771号