Dilworth 定理
对于偏序集 D D D,我们有若干概念:
- 链: D D D 中的一个子集 C C C 满足 C C C 中任意两个元素都可比,即构成全序集。
- 反链: D D D 中的一个子集 B B B 满足 B B B 中任意两个元素都不可比,即任意非空子集都不是全序集。
- 链覆盖(链划分):若干个链的并集为 D D D,且两两之间并集为 ∅ \empty ∅。
- 反链覆盖(反链划分):若干个反链的并集为 D D D,且两两之间并集为 ∅ \empty ∅。
- 最长链:元素个数最多的链(可以有多个)。
- 偏序集高度:最长链的元素个数。
- 最长反链:元素个数最多的反链(可以有多个)。
- 偏序集宽度:最长反链的元素个数。
- 极小元: D D D 中的一个元素 a a a 满足不存在 x < a x<a x<a 的元素。偏序集的所有极小元集合形成一条反链。
- 极大元: D D D 中的一个元素 a a a 满足不存在 x > a x>a x>a 的元素。偏序集的所有极大元集合形成一条反链。
Dilworth 定理:
-
对于任意有限偏序集,其最长反链中元素的数目必等于最小链覆盖中链的数目。
即:最小链覆盖 = 最长反链 = 偏序集宽度。
证明:
首先显然有最小链覆盖小于等于最长反链,所以我们只需构造一组链覆盖等于最长反链即可。假设最长反链大小为 m m m。
-
情形 1:存在一个大小为 m m m 的反链 A A A,它既不是 D D D 的所有极大元集合,也不是 D D D 的所有极小元集合。
那么对于 D D D 中的任意一个元素 x x x,它要么属于 A A A,要么小于 A A A 中的某个元素,要么大于 A A A 中的某个元素。因为:1. 若 x x x 上述三种情况都不满足,那么显然 A A A 加入 x x x 之后仍为一条反链且更长,矛盾;2. 若 x x x 同时满足三种情况中的任意两种情况,说明 A A A 中存在两个元素是可比的,矛盾。
那么如果我们把设 A + A^{+} A+ 表示 { x : x ∈ D ∧ ∃ a ∈ A , x ≥ a } \{x:x\in D\land \exist a\in A,x\geq a\} {x:x∈D∧∃a∈A,x≥a}, A − A^{-} A− 表示 { x : x ∈ D ∧ ∃ a ∈ A , x ≤ a } \{x:x\in D\land \exist a\in A,x\leq a\} {x:x∈D∧∃a∈A,x≤a},那么就有 A + ∩ A − = A A^+\cap A^-=A A+∩A−=A 且 A + ∪ A − = D A^+\cup A^-=D A+∪A−=D。
显然 A + A^+ A+ 和 A − A^- A− 的最长反链大小都不变,仍然是 m m m,于是我们对它们归纳处理,可以得到 A + A^+ A+ 和 A − A^- A− 都能被划分成 m m m 条链,且 A A A 中的每一个元素在 A + A^+ A+ 和 A − A^- A− 都恰好在一条链中。于是我们把 A + A^+ A+ 和 A − A^- A− 各自的 m m m 条链拼接起来即可得到 X X X 的一个链划分。
-
情形 2:不存在一个大小为 m m m 的反链 A A A,它既不是 D D D 的所有极大元集合,也不是 D D D 的所有极小元集合。即 A A A 的可选范围只有极小元集合或极大元集合。
那么我们选取一个极小元 x x x 和一个极大元 y y y 满足 x ≤ y x\leq y x≤y,那么 X − { x , y } X-\{x,y\} X−{x,y} 的最长反链就一定是 m − 1 m-1 m−1,然后对它归纳处理。于是将 X − { x , y } X-\{x,y\} X−{x,y} 的 m − 1 m-1 m−1 条链和链 { x , y } \{x,y\} {x,y} 一起给出了将 X X X 划分成 m m m 条链的一种构造。
-
-
对于任意有限偏序集,其最长链中元素的数目必等于其最小反链覆盖中反链的数目。
即:最长链 = 最小反链覆盖 = 偏序集高度。
证明:
首先显然有最小反链覆盖大于等于最长链,所以我们只需构造一组反链覆盖等于最长链即可。假设最长链大小为 m m m。
我们注意到:最长链一定包含恰好一个极小元;所有极小元集合形成一条反链。那么我们可以把所有极小元集合单独提出来当成一条反链,并对偏序集剩下的部分归纳处理(剩下的部分的最长链长度一定是 m − 1 m-1 m−1),即可得证。
Dilworth 定理与 DAG
我们可以把 DAG 上的点集当成偏序集,DAG 上点的 “可达性” 当成偏序关系,那么 DAG 上的最小可重路径覆盖(要求覆盖所有点)就是这个偏序集上的最小链覆盖。
同理,我们可以把 DAG 上的边集当成偏序集,DAG 上边的 “可达性” 当成偏序关系,那么 DAG 上的最小可重路径覆盖(要求覆盖所有边)就是这个偏序集上的最小链覆盖。
对于 DAG 上的最小点不交路径覆盖问题(要求覆盖所有点),我们可以用二分图最大匹配来解决。我们知道在点不交路径覆盖中,路径的条数等于 n n n 减去所有路径的边数之和。那么我们直接对于每个点拆点,然后在入点出点的二分图上跑最大匹配即为所有路径边数之和的最大值。
对于 DAG 上的最小边不交路径覆盖问题(要求覆盖所有边),我们知道路径的条数等于 m m m 减去各条路径中拼接两条边的这样的拼接点的个数,那么答案就等于 m − ∑ u = 1 n min ( i n u , o u t u ) m-\sum_{u=1}^n\min(in_u,out_u) m−∑u=1nmin(inu,outu)。
对于 DAG 上的最小可重路径覆盖问题(要求覆盖所有点),我们有一种暴力解法:我们把路径上任意可达的两个点 u , v u,v u,v 之间都连边,即补全这个偏序图,形成 O ( n 2 ) O(n^2) O(n2) 条边。然后转变为 DAG 上的最小点不交路径覆盖问题,因为对于原问题中的任意一组解,都存在一种把每个点分配给每条路径的方式,使得在新图中变成条数相同的路径,而显然对于新问题中的任意一组解,都存在对应回原问题的一组解。
对于 DAG 上的最小可重路径覆盖问题(要求覆盖所有边),暴力解法也是类似的,只不过要补全的是 O ( m 2 ) O(m^2) O(m2) 条边的偏序图。