「hdu - 6355」Fireflies

link。


DAG 上的可重最小链覆盖,转化成偏序集的最大反链,其中偏序 xy 当且仅当每一维 xiyi

以下记 ai=pi1。考虑如下的等价问题:

给定包含 n 种元素的多重集 S,其中 i 种元素出现 ai 次。

定义子集之间的偏序为 ,求最大反链。

ai=1 时即 Sperner 定理。事实上,该定理可以推广得到如下结果:

M=a2,则选择所有大小为 M 的子集即达到最大反链。


考虑证明。

LYM 不等式:

记反链中大小为 i 的子集数量为 si,有:

i=0nsi(ni)1

证明:

考虑一条最长链 T1Tn=S,其中 |Ti|=i

包含某个大小为 k 的子集 Pk 的最长链数量为 k!(nk)!。所有最长链总数为 n!

对于一条反链,没有两个子集在同一个最长链上,所以有不等式:

i=0ni!(ni)!sin!

得证。


Sperner 定理:

n 元集合,最多能选出 (nn2) 个子集,满足没有任何两个子集之间存在包含关系,。

证明:

不难发现这是一个下界,考虑证明它同时也是上界。

由于 (nn2)(ni),所以 i=0nsi/(nn2)i=0nsi/(ni)1,得到 si(nn2),于是它为上界。

然而很可惜的是,我并不会按照这个思路推广(查了 wiki 也不会,水平有限)。

考虑另一种证法(在《Introductory Combinatorics》中的 5.6 写到了这种证法)。

依然只需要证明上界,考虑用 Dilworth 定理转化,只需要找到一个大小为 (nn2) 的链覆盖。

引入对称链的概念:我们称子集链 T1T2Tk 是对称链,当且仅当 |Ti|+1=|Ti+1||T1|+|Tk|=n

注意到每条对称链恰好包含一个大小为 n2 的子集,因此对称链覆盖大小一定为 (nn2)


归纳构造对称链覆盖,只有一个元素时是平凡的,考虑往已经求出链覆盖的集合中加入元素 x

对于原来的链覆盖中每条对称链 T1T2Tk,分两种情况:

(1)k=1,在新的链集中加入链 T1T1{x}

(2)k1,在新的链集中加入链 T1T2TkTk{x}T1{x}T2{x}Tk1{x}

不难发现它仍然是链覆盖(每个子集都不重不漏地被包含在某条链中),且每条链仍然是对称链。

这个证法就比较好推广到多重集上了。

多重集情况的证明:

大致思路一致,归纳构造对称链,每次加入 a 个元素 x。为了方便,以下记 k×x 表示 k 个元素 x

对于链覆盖中每条对称链 T1T2Tk,依次在新的链集中加入如下的链(如果长度不够了就不管):

T1T2TkTk{1×x}Tk{2×x}Tk{a×x}T1{1×x}T2{1×x}Tk1{1×x}Tk1{2×x}Tk1{a×x}T1{2×x}T2{2×x}Tk2{2×x}Tk2{3×x}Tk2{a×x}T1{a×x}T2{a×x}Tka{a×x}

依然不难发现它仍然是链覆盖,且每条链仍然是对称链。

由于每条对称链都包含恰好一个大小为 a2 的子集,因此这就是上界。


之后就是个经典容斥,可以将组合数拆成 n 次多项式,然后 meet in the middle 即可。

直接做 O(2n/2n2),不知道能不能 O(2n/2n),口胡了个失败的做法(悲)。

posted @   Tiw_Air_OAO  阅读(342)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示