Dilworth 定理与二分图部分理论

fjy666 / 2024-11-07 / 原文

给定一个 DAG,定义

  • 链:一条链内任意两点之间都存在一条路径
  • 反链:任意两点都不存在路径

Dilworth 定理:最长反链 \(=\) 最小链覆盖。

最小链覆盖内一个点只能归属于一条链,但链不一定是连续的。

事实上这个还能转化为“选出若干条(一般定义下的)链,但一个点可以在多条链内”,本质相同。

求出 DAG 的传递闭包,则可转化为选出若干条链(指一般定义下的链),每个点只能在一条链内。

称这个问题为最小不可重链覆盖

解决方法是,把每个点拆成 \(x_{in}, x_{out}\),对于一条边 \((u, v)\) 连接 \((u_{out}, v_{in})\)

最后求出最大匹配。

最小不可重链覆盖,显然选出链的条数为 \(n-\) 边数,而一个 \(x_{in}\)\(x_{out}\) 只能对应一条边,于是显然边数为最大匹配。

于是答案为 \(n-\) 最大匹配。

在构造合法解之前,我们先来过一过二分图理论!!


  1. 最大独立集 $= n - $ 最小点覆盖

这个在一般图上也成立,求出任意最大独立集 / 最小点覆盖后取反即可。

  1. König 定理:最小点覆盖 \(=\) 最大匹配

证明:显然最小点覆盖 \(\ge\) 最大匹配。

以下构造可以构造出一组 \(=\) 最大匹配的最小点覆盖。

如何求最大匹配?一般做法是建图 \((S, u, 1), (u, v, 1), (v, T, 1)\) 再跑最大流。

根据 最大流=最小割,该图的最小割同样也是最大匹配。

最小割的构造:在残量网络上找出所有两个端点一个与 \(S\) 联通,一个不与 \(S\) 联通的边。

观察到最小割中隔断的边必然是 \((S, u, 1)\)\((v, T, 1)\),那取出所有这种点构成的点集即为最小点覆盖。

正确性显然,如果边 \((u, v)\)\(u\)\(v\) 都没被割掉,\(S-u-v-T\) 形成增广路。

来点 例题:CF1721F - Matching Reduction。


回到 Dilworth 定理的解构造上。

拿出二分图的最大独立集 \(I\),把所有满足 \(x_{in}, x_{out} \in I\)\(x\) 都取出来放到最长反链 \(A\) 里。

正确性:\(I\) 为独立集(注意到这依赖于你是对传递闭包建图的)。

最大性:

\(S\) 为最大匹配,则 \(I=2n-S\)\(I-A\le n\)\(A\ge I-n=n-S\)

这样!我们构造出了一个大小至少是 \(n-m\)的反链!然后最小链覆盖的大小就是 \(n-m\),反链的大小不会超过它,所以这个反链的大小就是 \(n-m\),且是我们要求的最大反链。


模板:P4298 - [CTSC2008] 祭祀

模板微调:CF590E - Birthday


让我们来点 高性能 优化!

最大权独立子图为如下问题:

  • 给定一张有向图,每个点都有权值 \(v_i\)
  • 定义一个独立子图为 \(S\subseteq \{1,2,\cdots, n\}\),满足对于所有 \((u,v)\in \mathbb{E}\)\(u\in S\Rightarrow v\in S\)
  • 需要找到内部权值和最大的独立子图。

解法可以参见链接。

考虑将原图的点拆成两个点,\(u_{+}\)\(u_{-}\),点权分别为 \(1\)\(-1\),从 \(u_{-}\)\(u_{+}\) 连边。

对于原图中的每条边 \((u, v)\),连边 \(u_{+}\to v_{-}\),最后求整个图的最大权独立子图即为最长反链。

考虑一个点 \(u\)\(u\) 对最大权独立子图的贡献要么是 \(1\)(仅有 \(u_{+}\) 在里面),要么是 \(0\)(都不在里面或者都在里面)。最长反链即为所有贡献是 \(1\) 的节点。

显然,假如 \(u\) 的贡献是 \(1\),所有 \(u\) 能到达的点的贡献均为 \(0\),因此满足“不能互相到达”的条件。

由于无需求出传递闭包,时间复杂度为 \(\mathcal{O}(m\sqrt{n})\)

构造“最长反链”的方法是平凡的。