其实是在做题时遇到这个定理的。

这个定理的图论意义是:

对于一个二分图\(G=\{X+Y,E\}\),它满足:

\(\forall W \subseteq X, \, |W| \leq |N_G(W)|\) \(\iff\)\(X\)中的每个结点都有匹配.

其中\(N_G(W)\)为图\(G\)中所有与\(W\)相连的结点的集合。

必要性显然。

对于充分性,不会……以后再补充。

由这个定理,我们能得到一个推论:

二分图\(G\)的最大匹配\(M\)等于\(|X| - \max (|W| - |N_G(W)|)\).

顺便一提,我们允许\(W = \emptyset\),故\(\max (|W| - |N_G(W)|) \geq 0\)。

我们分两步来证明这个推论。在此,我们假设\(W_0 \subseteq X\)满足\(|W_0| - |N_G(W_0)| = \max (|W| - |N_G(W)|)\)

  • 证明:\(M \leq |X| - \max (|W| - |N_G(W)|)\).

    考虑\(W_0\),即使\(N_G(W_0)\)中的每个结点都与\(W_0\)中的结点匹配,也会有\(|W_0| - |N_G(W_0)|\)个结点得不到匹配。故\(X\)中至少有\(|W_0| - |N_G(W_0)|\)个结点得不到匹配。因此,\(M \leq |X| - \max (|W|)\)。
  • 证明:\(M \geq |X| - \max (|W| - |N_G(W)|)\).

    我们在\(Y\)中添加\(\max (|W| - |N_G(W)|\)个结点与\(X\)中所有结点相连得到新图\(G`\),那么,\(|W_0| - |N_{G`}(W_0)| = 0\)。由Hall‘s Marriage Theorem可知,图\(G`\)中\(X\)的每个元素都有匹配。而对于\(W_0\),因为\(|W_0| = |N_{G`}(W_0)|\),所以\(N_{G`}(W_0)\)中的每个元素都与\(W_0\)中的元素匹配,可得我们新加入的结点都有匹配。因此,除\(W_0\)中有\(|W_0|-|N_G(W_0)|\)个结点与新加入的结点匹配之外,\(X\)中其余结点都与原来\(Y\)中的结点匹配。故在删去新加的结点后,\(X\)中至多有\(|W_0| - |N_G(W_0)|\)个结点没有匹配。则\(M \geq |X| - \max (|W| - |N_G(W)|)\)。

那么,这个定理及其推论有什么用呢?因为要枚举\(X\)的所有子集,所以一般是没什么用的。然而,某些有特殊性质的二分图的最大匹配问题,会使用这个定理及其推论来转化问题。

例题

arc076F Exhausted?

题意:给出二分图\(G=\{X+Y,E\}\),\(X\)中的所有结点满足:若其编号为\(i\),则只与\(Y\)中编号小于等于\(L_i\)或编号大于等于\(R_i\)的结点连边。给出\(|X|,|Y|\)和所有的\(L_i,R_i\),求\(G\)的最大匹配\(M\)。(输出\(|X|-M\))

\(|X|,|Y| \leq 2 \times 10^5\).

有了这个定理,问题就简单了。我们只要求\(\max (|W| - |N_G(W)|)\)。对于\(W \subseteq X\),\(N_G(W)\)就是形如\(Y - [l,r]\)的形式,其中\([l,r]\)是\(Y\)中一个编号的区间。我们枚举\(r\),用线段树实现区间加和区间查最大值即可。具体做法不再阐述。

时间复杂度\(O(n \log n)\)。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 200010;
  4. int n,m,ans,cnt;
  5. struct data {
  6. int l,r;
  7. } ordl[N],ordr[N];
  8. bool cmpl(data a,data b) {
  9. return a.l < b.l;
  10. }
  11. bool cmpr(data a,data b) {
  12. return a.r < b.r;
  13. }
  14. struct node {
  15. int mx,tag;
  16. } t[N << 2];
  17. void puttag(int x,int val) {
  18. t[x].mx += val;
  19. t[x].tag += val;
  20. }
  21. void push_down(int x) {
  22. puttag(x<<1,t[x].tag);
  23. puttag(x<<1|1,t[x].tag);
  24. t[x].tag = 0;
  25. }
  26. void push_up(int x) {
  27. t[x].mx = max(t[x<<1].mx,t[x<<1|1].mx);
  28. }
  29. void modify(int l,int r,int val,int x=1,int lp=1,int rp=m) {
  30. if (l > rp || r < lp) return;
  31. if (lp >= l && rp <= r) {
  32. puttag(x,val);
  33. return;
  34. }
  35. if (t[x].tag) push_down(x);
  36. int mid = (lp + rp) >> 1;
  37. modify(l,r,val,x<<1,lp,mid);
  38. modify(l,r,val,x<<1|1,mid+1,rp);
  39. push_up(x);
  40. }
  41. int query(int l,int r,int x=1,int lp=1,int rp=m) {
  42. if (l > rp || r < lp) return 0;
  43. if (lp >= l && rp <= r) return t[x].mx;
  44. if (t[x].tag) push_down(x);
  45. int mid = (lp + rp) >> 1;
  46. return max(query(l,r,x<<1,lp,mid),query(l,r,x<<1|1,mid+1,rp));
  47. }
  48. int main() {
  49. int a,b;
  50. scanf("%d%d",&n,&m);
  51. ans = max(0,n - m);
  52. cnt = n;
  53. for (int i = 1 ; i <= cnt ; ++ i) {
  54. scanf("%d%d",&a,&b);
  55. a ++;
  56. b --;
  57. if (a > b) {
  58. i --, cnt --;
  59. continue;
  60. }
  61. ordl[i] = (data) {a,b};
  62. ordr[i] = (data) {a,b};
  63. }
  64. sort(ordl+1,ordl+cnt+1,cmpl);
  65. sort(ordr+1,ordr+cnt+1,cmpr);
  66. int pl = 1, pr = 1;
  67. for (int i = 1 ; i <= m ; ++ i) {
  68. modify(1,i,1);
  69. for (; ordl[pl].l <= i && pl <= cnt ; ++ pl)
  70. modify(ordl[pl].l,m,1);
  71. ans = max(ans,query(1,i) - m);
  72. for (; ordr[pr].r <= i && pr <= cnt ; ++ pr)
  73. modify(ordr[pr].l,m,-1);
  74. }
  75. printf("%d\n",ans);
  76. return 0;
  77. }

小结:学了一个没卵用的定理。也挺好奇还有哪些二分图能用到这个定理。


upd 2018.12.26

假如\(G\)满足,\(X\)中的每一个结点与\(Y\)中一个区间内的结点连边,即\(\forall a \in X, N_G(a) = [l_a,r_a]\)。

定义对于\(Y\)中的一个编号区间\([l,r]\),\(f([l,r])\)为\(X\)中只与\([l,r]\)中点连边的点构成的集合,即\(\{ a \in X \ | \ N_G(a) \subseteq [l,r] \}\)。

求证:

\[\forall [l,r] \subseteq Y, |f([l,r])| \leq |[l,r]| \iff \forall W \subseteq X, |W| \leq |N_G(W)|
\]

证明:

  • 必要性。令\(W = f([l,r])\),那显然有\(N_G(W) \subseteq [l,r]\)。因此,\(|f([l,r])| = |W| \leq |N_G(W)| \leq |[l,r]|\)。
  • 充分性。考虑任意一个\(W \subseteq X\),那么\(N_G(W)= \bigcup_{a \in W} [l_a,r_a]\)。那么,\(N_G(W)\)就一定可以被表示为若干个互不相交的区间的并。因为每个\(X\)中的结点都只和一个区间内的点连边,所以我们可以把\(W\)划分为若干个集合,其中每个集合对应\(N_G(W)\)中的一段区间。对于我们划分出来的任意一个集合,假如它对应的区间为\([l,r]\),那这个集合就一定是\(f([l,r])\)的子集。因此,对于\(W\)划分出来的每一集合\(S\)都满足\(|S| \leq |N_G(S)|\),故\(W\)也满足\(|W| \leq |N_G(W)|\)。

【学习】Hall’s Marriage Theorem的更多相关文章

  1. 【CF981F】Round Marriage(二分答案,二分图匹配,Hall定理)

    [CF981F]Round Marriage(二分答案,二分图匹配,Hall定理) 题面 CF 洛谷 题解 很明显需要二分. 二分之后考虑如果判定是否存在完备匹配,考虑\(Hall\)定理. 那么如果 ...

  2. 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 4 The Central Limit Theorem

    Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

  3. 关于Hall定理的学习

    基本定义 \(Hall\) 定理是二分图匹配的相关定理 用于判断二分图是否存在完美匹配 存在完美匹配的二分图即满足最大匹配数为 \(min(|X|,|Y|)\) 的二分图,也就是至少有一边的点全部被匹 ...

  4. Matrix_tree Theorem 矩阵树定理学习笔记

    Matrix_tree Theorem: 给定一个无向图, 定义矩阵A A[i][j] = - (<i, j>之间的边数) A[i][i] = 点i的度数 其生成树的个数等于 A的任意n ...

  5. 【CF981F】Round Marriage(二分答案,hall定理)

    传送门 题意: 给出一个长度为\(L\)的环,标号从\(0\)到\(L-1\). 之后给出\(n\)个新郎,\(n\)个新娘离起点的距离. 现在新郎.新娘要一一配对,但显然每一对新人的产生都会走一定的 ...

  6. 【Matrix-tree Theorem学习笔记】

    定义度数矩阵\(D(G)\): 定义邻接矩阵\(C(G)\): 定义\(Laplace\)矩阵\(A\) \( A(G) = D(G) - C(G) \) 记图\(G\)的所有生成树权值和为\(t(G ...

  7. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  8. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  9. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

随机推荐

  1. springboot之session、cookie

    1-  获取session的方案 session:  https://blog.csdn.net/yiifaa/article/details/77542208 2-  session什么时候创建? ...

  2. css 渐变动画

    就是这样 这是一段可选文字 -------------------------------------- 代码如下 CSS代码: @media all and (-webkit-min-device- ...

  3. Sql Server参数化查询之where in和like实现详解 [转]

    文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where ...

  4. 变量part2

    一 变量值具有三个特征:  1. id:变量值的唯一编号,内存地址不同id则不同  2. type:类型  3. value(值) #name='xia' #print(id(name)) #age= ...

  5. mysql 对表字段进行长度截取操作

    现在的问题是数据库某一个表中其中的车牌号字段有些数据多了一位,需要把它找出来然后把多的最后一位去掉..... 通过自带的length(字段名)函数把长度过长的数据过滤出来,其中,一个汉字算3个字符,一 ...

  6. python pprint

    使用 pprint 模块 pprint 模块( pretty printer ) 用于打印 Python 数据结构. 当你在命令行下打印特定数据结构时你会发现它很有用(输出格式比较整齐, 便于阅读). ...

  7. linux 开始

    3306 -- mysql 8000--django默认 服务由端口控制 https -- 443 http -- 80 linux发行版:1.centos 免费版的redhat2.ubuntu 乌版 ...

  8. 1069: 统计字符gets函数

    题目描述 编制程序,统计文本stdin中字符$出现的次数,并将结果写入文件stdout 输入 字符文本 输出 $次数 样例输入 as$dfkjhkjkjdhf asdfkj$lskdfj werijw ...

  9. 51nod 1057 N的阶乘 (大数运算)

    输入N求N的阶乘的准确值.   Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 Input示例 5 Output示例 120 压位: 每个数组元素存多位数 ...

  10. 2、在VM上的 CentOS 6.5 上安装mysql

    1.查看系统是否安装了MySQL     使用命令:     #rpm -qa | grep mysql 2.卸载已安装的MySQL      卸载mysql命令如下:       #rpm -e - ...