Dilworth定理
定义偏序集合 ((x,le)) 这里的 (le) 不代表 “小于等于”,而是一种关系
定义 “可比” 表示 (x) 中的两个元素满足 (ale b) 或者 (ble a),反之就是不可比
偏序集合中的元素满足如下三点
-
(ale a)
-
(ble a,ale cRightarrow ble c)
-
(ale b,ble aRightarrow a=b)
定义一个链为链中相邻的元素可比,同时不难发现任意元素可比,同时定义反链表示任意元素不可比
定义极小元 (x) 表示在当前的偏序集所有的可以和其相比的元素 (y) 中,都满足 (xle y)
由上得到一个定理:
- 设 ({S}) 的最长链长度为 (r),那么最小反链划分等于 (r)
证明如下:设 (p) 为最小反链划分
首先考虑如果可以划分出来比 (r) 更小的反链个数,那么必然有两个最大链中的元素属于同一个反链
不符合条件,那么 (pge r)
另一个部分考虑证明 (ple r) 不断取出来 ({S}) 中的极小元集合,设一共取出了 (k) 次,那么那么不难发现必然有一个长度为 (k) 的链
考虑有 (p) 为最小反链划分,每次取出来的最小元集合必然内部不可比,所以是一个反链划分,所以有 (rge kge p)
对偶上述定理,得到 ( m{Dilworth}) 定理
- 设 ({S}) 的最长反链长度大小为 (r),那么集合中最少可以划分出来 (r) 个链
第一部分改变定义之后完全一样,第二部分不是极小元,而是每个极小元所在的联通块
例题
CTSC2008 祭祀
先跑 ( m{Floyd}) 传递闭包和最大独立集过第一问
有一种最大独立集的构造方式是:
-
从右侧没有匹配的点开始 (dfs),向左侧只能走非匹配边,左侧向右侧只能走匹配边
-
取左侧被访问的点和右侧没有被访问的点得到最大独立集
-
取最大独立集的补集得到最小点覆盖
对应到这个题目中就是对于 (in) 被访问而 (out) 没有被访问的点(注意 (out) 是左部点)
证明:
设 ({C}) 表示最小点覆盖的集合,({I}) 表示最大独立集的集合,(mat) 表示最大匹配数,({S})
(|I|=2n-|C|=2n-mat,|I|-|C|=) 表示有一些点只有 (in/out) 在 ({S}) 中
这样的点不超过 (n) 个那么 (|I|ge n-mat),而 (|I|) 一定不会大于 (n-mat),也就是二分图的正确性
证毕
Codeforces590E
不难发现如果求出来了字符串两两之间的子母串关系,那么这个问题就转化成了上面的问题
子母串是 (AC) 自动机的管理范畴(所以又重学了 (AC) 自动机)
这里每次暴力沿着 (fail) 树往上面跳复杂度就成 (Theta(nsum)) 的,那么不难想到维护当前和最长子串然后跑 (Floyd) 传递闭包
首先维护 (AC) 自动机上每个点的前驱,这个在 (insert) 的时候不难做
并维护每个点不断跳 (fail) 能得到最近有标记结尾的点,在并查集中放到同一个集合里面
处理 (1dots n) 所有的串,每次沿着结尾点不断跳上文定义的父亲,并且连上这个点和这个点跑 (fail) 的并查集得到的点
最后跑个祭祀就完事了