zoukankan      html  css  js  c++  java
  • 关于hall定理的一些随笔

    Hall定理

    设二分图左右两部分为 (X, Y), 则:

    **二分图存在完美匹配 (Leftrightarrow) $ forall X' subseteq X, F(X') >= |X'|$ **

    ((F(X'))(Y) 中与 (X') 中任意点相连的点的个数; 或者说, 在 (Y) 中, 有且仅有 (F(X')) 个点与 (X') 中的点有连边)

    证明: (后者为前者的充要条件) (均为感性伪证,一些感想,算不得证明, 我太弱了QwQ, 不喜勿喷, 可以交流呀)
    • 充分性证明:

    假设存在二分图没有完美匹配, 但满足后者 (记为 (q) )

    记二分图的两部分为 (X,Y)

    那么设该二分图存在最大匹配, 该匹配所对应的点集分别为 (X', Y') ( (X' subsetneqq X, Y' subsetneqq Y) )

    对于元素 (a) ( (a in X, a otin X') )

    因为它没有被匹配, 意味着它所有可能的对应点都被匹配了 ([1.1])

    强行令 (a) 匹配其可行的对应点 (b), (b) 原先必然匹配了一个点 (c), 否则 (a) 早就匹配了 (b)

    (q), 对于 $ {a, c} $ 它的对应点的集合大小(2), 同时 $ {a},{c}$ 的对应点的集合大小都至少为 (1)

    1. 如果说此时 (c) 没有可行的对应点(包括已经被匹配的) 了, 那么说明 ({a})对应点的集合大小 至少为 (2), 因为如果对应点的集合大小为 (1), 说明仅有 (a-b,c-b) 两条边, 显然, 这样并不满足 (q)

      那么 (a) 可以放弃与 (b) 链接, 寻找另一个可行对应点链接

    2. 如果说此时 (c) 还有可行的对应边, 此时 (c) 可以继续做 (a) 之前做过的事

    若不存在环, 存在链, 进行如上两个操作最终能完成, 因为每次相当于访问过一个结点 ( 除非点集无限...... )

    若存在环, 由二分图定义(还是性质?)显然可知, 该环为 偶环, 我们可以设该环点集为 ({v_1, v_2,...v_n}) (相邻标号点有连边, (v_1)(v_n) 有连边, (n) 为偶数), 那么我们显然可以构造一个方案, $v_1-v_2 , v_3-v_4, ... ,v_{n-1}-v_n $, 注意到, 这样再向外扩展也是可以的, 只是相当于把链接点再作为新的起点

    • 必要性证明:

    既然存在完美匹配, 那么我们把匹配完成的的 匹配边集 这样表示 ({x_1-y_1, x_2-y_2, ..., x_n-y_n})

    ((F(X'))(Y) 中与 (X') 中任意点相连的点的个数; 或者说, 在 (Y) 中, 有且仅有 (F(X')) 个点与 (X') 中的点有连边)

    显然, 对于 (forall x_0 in X, F({x_0}) >= 1), 因为已经存在了匹配, 说明至少必有一条匹配边

    匹配一一对应 知, 若有 (X' subseteq X), (F(X') >= |X'|) ( (|X'|) 即为 (X') 的集合大小, 或者说它所包含的元素个数 )

    上面的 (">=") 可以理解为, (X') 已经匹配的点的个数为 (|X'|), 但可能其中还有点可以匹配不在 (X') 当前对应匹配集合的点

    (证毕)

    参考了神仙学姐 litble 的课件中的一部分

    参考了百度百科 (什么鬼, 我看不懂)


    应用

    显然, 如果要证明有完美匹配, 枚举子集不太现实 (但还真有毒瘤出题人这么做了)

    根据学长 (boshi) 给我的信息, 现在市面上的题目, 一半是用 hall定理 处理区间上的, 一半是用 hall定理 证明某种结论的

    虽然很多我还没有见过......


    loj6062

    给定两个序列 (a_i) (长度为 (n) ) 和 (b_i) (长度为 (m) ), (a_i) 与所有和它的和大于等于 (h)(b_j) 连边,问
    (a) 中存在多少个长度为 (m) 的连续子序列,使得和 (b) 完美匹配。( (n, m ≤ 150000))

    啊这......

    看到 大于等于, 显然有 (a_i + b_j >= h) , 注意到 (h) 是定值

    因为 (a_i, b_j)散乱 的 ((a_i, b_j) 满足如上条件), 我们就很想让它们有序

    因为 (a) 中存在多少个长度为 (m) 的连续子序列 , 所以 (a) 不能改变, 但是可以给 (b) 由大到小 排序

    显然, 对于 (a_i), 它跟 (b) 的连边必然是 (b) 的一个后缀

    由上句知, (forall i in [1,m), F(b_i) <= F(b_{i+1})) ( (F(b_i)) 为与 (b_i) 连边的点的数量 )

    因为 (a) 中存在多少个长度为 (m) 的连续子序列 , 所以就有种像 滑动窗口 的感觉

    下面的情况均在 (a) 取一个窗口的情况下讨论

    这里我们推出一个本题的结论:

    该窗口存在与 (b) 的完美匹配 $ Leftrightarrow$ (forall i in [1, m), F(b_i) >= i)

    (F(b_i) < i) , 由 hall定理不存在完美匹配, 因为 ({b_1,b_2,...,b_i})(b) 的一个子集

    否则, 对于任意一段 (b' subseteq b) , (b') 的起始位置和结束位置分别为 (s,t)

    (b_{1,2,...,s-1}) 的已经匹配完成, 占了 (s-1) 个位置 ( 注意到对于 (b_i, b_j, i<j), (b_j) 对应的匹配位置一定包含了 (b_i) 对应的匹配位置), (F(b_t) >= t)

    所以, (F(b_t)-(s-1) >= t-(s-1) = t-s+1), 后者即 ([b_s, b_t]) 的长度

    对于不连续的段, 那么对于每段都满足上面这个结论

    所以, 综上, 我们只用判定对于每个 (i), 是否 (F(b_i) >= i) 即可

    变形得, (F(b_i)-i>=0)

    因为是带修改区间问题, 我们可以使用 线段树

    建一颗长度为 (m) 的线段树, 对于 (i) 号叶子结点, 在最开始时减去 (i), 查询时, 询问整个区间最小值是否大于等于 (0) 即可


    收获:

    • 对于序列上的题目, 运用 hall定理 需要发现序列的 性质

    • 对于序列上的题目, 运用 hall定理 往往需要辅助数据结构 ( 线段树, 树状数组...... )


    BZOJ3693

    (n) 组人要一起开一个圆桌会议(编号为(0) ~ (n-1)), 会议的圆桌上有 (m) 个位置( 编号为 (0) ~ (m-1) ). 每个组有 (a_i) 个人, 他们需要被安排在( (l_i), ((l_i+1)%m), ((l_i+2)%m), (...) , (r_i) )的座位范围内. 每个座位只能安排一个人就坐, 并且每个人都需要被安排一个座位. 现在你需要判断是否存在满足条件的座位安排, 对于每组数据, 输出 (Yes)(No)

    不超过 (10) 组数据, (n leq 10^5, m leq 10^9)

    首先对于环, 断环为链

    这题相当于 每一个人 要匹配一个座位 ( 以人为 (X) 集 )

    但是, 注意到 (m leq 10^9), 说明人必然不少

    而对于一个人而言, 他的可选位置很多

    而对于每一组而言, 这一组会与其它组休戚相关, 考虑起来很麻烦

    那么我们换一种考虑方式 ( hall定理 变了味? )

    我们以座位为考虑对象

    对于任意一段位置 ([L,R]), 我们考虑这一段位置是否能让所有满足 (L leq l_i, r_i leq R) 的组区间 ([l_i, r_i]) ( 即被完全包含 ) 都能坐下

    我们不考虑一部分在这座位区间的组 ( 即不被完全包含的组, 或者说与这个座位区间有交集但不是包含关系的组 ), 因为注意上面的 "任意一段位置 ([L,R]) ", 总会有其它座位区间考虑到它的

    为了优化复杂度, 我们考虑最极端的情况

    假设一段位置区间为 ([L,R]), 其中被完全包含的组人数之和记为 (sum), 这些组分别为 ([l_i,r_i],[l_{i+1},r_{i+1}],...,[l_j,r_j])

    显然需要满足 (R-L+1 geq sum)

    为了保证极端情况, 很显然, (L = min{l_k|k in [i,j]}, R = max{r_k|k in [i,j]})

    现在考虑怎么把左边尽可能地小, 右边尽可能地大

    变形不等式

    (R-L+1 geq sum Rightarrow R + 1 - ( sum+L) geq 0)

    显然就是要左边尽可能地小

    (R) 对于每一个询问都知道了

    显然可以把左端点离散化开一颗线段树, 每次就把 (l_j leq l_i) 的地方加上 (a_i), 预先加上 (l) 就好了

    每次查最大值

    (留坑)

  • 相关阅读:
    C# HTTP系列9 GET与POST示例
    [译]Android Studio 3.6 新特性概览
    mysql error 1290 hy000:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statemen' 解决方案
    mysql error 1130 hy000:Host 'localhost' is not allowed to connect to this mysql server 解决方案
    Windows+Apache2.4.10+PHP7.0+MySQL5.6.21安装
    php版本的选择
    PHP,Mysql根据经纬度计算距离并排序
    windows无法启动MySQL服务 错误1067
    PHP MYSQL 搜索周边坐标,并计算两个点之间的距离
    html5获取用户当前的地理位置,即经纬度。
  • 原文地址:https://www.cnblogs.com/cssyz-wjj/p/13479548.html
Copyright © 2011-2022 走看看