最小链覆盖 - Dilworth 定理 小记
内容 & 证明
Dilworth定理,一言以蔽之,偏序集能划分成的最少的全序集个数等于最大反链的元素个数。——litble。
即最小链覆盖数等于最长反链的长度。
例子:求一个序列最少划分成多少个最长不下降子序列,等价于求序列的最长下降子序列长度。
不严谨证明(仅讨论二维偏序):
假设最小链覆盖等于 \(N\),最大反链等于 \(M\)。
证明 \(N\ge M\):最大反链中任意两个点都是不可比的,因此反链上每个点都各属于不同的链覆盖中,则 \(N\ge M\)。
证明 \(N\le M\):求出每个点开始的最长反链长度 \(f(x)\),我们按 \(f(x)\) 相同的点分层。可以知道同一层的任意两个点都是可比的,不然如果存在同一层两个点 \(x,y\) 不可比,则 \(f(x)\gets f(y)+1\),则与同一层矛盾。于是,同一层的点可以划分为一个链覆盖, 于是 \(N\le M\)。
例题 1:P3974 [TJOI2015] 组合数学 - 洛谷
网格图路径可以看做选一条不上升子序列,要求选出最少的不上升子序列使得覆盖所有点。
利用 Dilworth 定理转化为求最长上升子序列。
例题 2:P14394 [JOISC 2016] 俄罗斯套娃 / Matryoshka - 洛谷
开始读错题了,始终不会算,注意:
其中所有底面直径不小于 A cm 且高度不超过 B cm 的套娃将提前交付。
所以每次加入一层 \(y\),然后用树状数组维护每个点开始的 LDS 即可。
例题 3:P10938 Vani和Cl2捉迷藏 - 洛谷
题目即要求最长反链,转化为求最小链覆盖(注意这里的链是一个点集而不是路径)。
用 Floyd 跑一次传递闭包转化为最小路径覆盖。
至于最小路径覆盖就是考虑 \(u\to v\) 化成二分图上的左部点 \(u\) 向右部点 \(v\) 连一条边,一开始每个点单独成路径,每次二分图上匹配一条边就表示两点所在路径首尾相连,于是最小路径覆盖就等于点数减去最大匹配。