Dilworth 定理
Dilworth 定理的应用应该说是比较广泛了。最近碰到了不少题目都要用到这玩意。
内容:对于任意有限偏序集,其最长反链的元素数等于最小链覆盖中的链数。
简单来说就是对于满足 \(\forall u,v,w \in V,(u,v),(v,w) \in E \Rightarrow (u,w) \in E\) 的图 \(G = (V, E)\),有 \(G\) 的最大独立集等于 \(G\) 的最小可相交路径覆盖。
证明:我们视偏序集中的偏序关系等价于单向边,偏序集形成的图是 DAG。
容易发现同一条链中的点不能同时存在于反链中,所以最长反链 \(\le\) 最小链覆盖。
对于一个 \(n\) 个点的偏序集形成的 DAG 求最小链覆盖可以用二分图匹配解决。建一个入点 \(i\) 和出点 \(i + n\),然后对于一条边 \((u, v)\),\(u\) 向 \(v + n\) 连边,然后求一下最大匹配 \(x\)。答案就是 \(n - x\)。
考虑最大独立集一定是 \(2n - x\),那么最大独立集两端的 \(i\) 和 \(i+n\) 都选的至少有 \(n - x\) 个。这 \(n - x\) 个形成的必然是反链,所以最长反链 \(\ge\) 最小链覆盖。
所以最长反链等于最小链覆盖!
trick
这个定理在关于最长上升/下降子序列中有很多运用。一个序列需要划分成的上升子序列数等于最长不上升子序列长度。
板子:NOIP1999普及组 导弹拦截。
CF1620F. Bipartite Array
给定一个排列,要求把若干元素取反,使得最长下降子序列 \(\le 2\)。
题解
也就是要求能拆分成两个最长上升子序列。
\(\rm DP\) 一下,记录上一个元素有没有取反,存上一个元素值至少要是多少即可。