• 【学习笔记】Dilworth 定理的构造性证明


    发现自己并不会 Dilworth 定理的构造性证明(原题要求输出方案),于是去 Wiki 上学习了一下。下文是我参照 Wiki 上的证明思路口胡的一个证明。

    附例题:Codeforces 590E

    Dilworth 定理: DAG 的最长反链大小等于最小链覆盖大小。
    反链是指从图中的一个点的集合,使得集合内点两两不可达;链覆盖是指用若干条可以相交的链覆盖图中所有的点。

    证明:

    1. 首先考虑如何求 DAG 的最小链覆盖。

      传递闭包,转化成用若干条不能相交的链进行覆盖。然后给每个点拆成两个点 ((u,u')),分别代表入点和出点,对于原图任何一条边 ((u,v)),从 (u)(v') 连边,最终的答案就是 (n) (图的点数)减去该二分图的最大匹配数。这是因为一条匹配边意味着边两端的点可以被放在同一条链中,且入点和出点保证了每个点的入度和出度都不超过 (1).

      利用这种方法,我们可以求出 DAG 最小链覆盖的大小,并得到一种将二分图最大匹配的方案和 DAG 最小链覆盖的方案建立对应的方法。

    2. 我们需要利用另一个定理:
      Konig 定理: 二分图的最大匹配等于最小点覆盖。
      点覆盖是指图中一个点的集合,使得每条边至少有一个端点在集合中。
      该定理的构造性证明将在后文叙述。

      现在假设我们根据二分图最大匹配的方案,构造出了一种最小点覆盖的方案。
      有如下结论:在由 Dilworth 定理转化出的二分图中,最小点覆盖不可能同时包含 (u)(u') 两点。
      这是因为,如果同时包含 (u​)(u'​),那意味着存在 (v,w​) 使得 ((v,u')​)((u,w')​) 有边。因为该图是传递闭包过的,所以 ((v,w')​) 必定有边。那么点覆盖一定包含一个原图中可达 (v​) 的点 (p​),或者一个原图中 (w​) 可达的点 (q​) (可以为 (v,w​) 本身). 如果存在点 (p​),那么 (u​) 就可以从点覆盖里删掉;如果存在点 (q​),那么 (u'​) 就可以从点覆盖里删掉。因此同时包含 (u​)(u'​) 的点覆盖一定不是最小点覆盖。

      既然如此,对于每个 (u),若 (u)(u') 都不在最小点覆盖中,就将其加入集合,否则不加入,这样集合的大小恰好是 (n-m) ((m) 为最大匹配数),且任何两个集合中的点原图中都没有边相连,故该集合是一条反链。而反过来也是一样,对于任何一条反链,所有的边都至少有一个端点在反链之外,故反链的补集一定对应二分图的点覆盖。于是我们得到了一种通过二分图最小点覆盖的方案求出 DAG 最长反链的方案的方法,并证明了最长反链大小等于最小链覆盖大小。

    3. 下面考虑如何构造性地证明 Konig 定理。我们让二分图两部之间的边的流量为 (+infty),显然这不影响答案。这样一来,二分图的最大匹配就相当于最大流,而最小点覆盖就相当于最小割。运行 Dinic 算法之后,我们求出一种最小割的方案。如果二分图中一个点和源点或者汇点的连边被割了,那么其对应的最小点覆盖方案中该点被选。

      于是我们得到了一种由二分图最大匹配方案得到最小点覆盖方案的方法。
      综上所述,我们在 1 中建立了二分图最大匹配方案和 DAG 最小链覆盖方案的对应,在 2 中找到了由二分图最小点覆盖方案得到 DAG 最长反链方案的方法,在 3 中找到了由二分图最大匹配方案得到二分图最小点覆盖方案的方法,那么也就找到了一种构造 DAG 最长反链的方法。

    4. 下面简化一下上面的构造方法。首先运行 Dinic 算法,然后在残量网络上 BFS 或者 DFS,求出 (S) 能到达哪些点。对于 (u) 来说,如果 (S) 可达 (u)(S) 可达 (u'),那么最小点覆盖的方案中 (u') 被选;如果 (S) 不可达 (u)(S) 不可达 (u'),那么最小点覆盖的方案中 (u) 被选;如果 (S) 不可达 (u)(S) 可达 (u'),则最小点覆盖方案中 (u)(u') 都被选,该情况不存在;如果 (S) 可达 (u)(S) 不可达 (u'),最小点覆盖中 (u)(u') 都不被选,即 (u) 应当存在于最长反链的方案中。

      于是,我们最终得到的构造最长反链的方法就是:(u) 在最长反链中当且仅当残量网络中 (S) 可达 (u)(S) 不可达 (u').

  • 相关阅读:
    UEditor 编辑模板
    Task ProgressBar模拟现实完成后显示TextBox
    Java Lambda map返回部分属性
    Socket编程
    字节流和字符流
    File类
    volatile的作用和原理
    Java四种引用类型
    ThreadLocal
    孤儿进程和僵尸进程
  • 原文地址:https://www.cnblogs.com/suncongbo/p/13320957.html
Copyright © 2020-2023  润新知