捉迷藏

这里主要是对蓝书上做法的补充

首先看到这道题目,我们假设已经知道要选哪些点了,那我们在原图G上每选一个点,与这个点有关的路径上的所有点都要被打上标记,打上标记的点就不能再选了,所以我们选的点就是每次都没有标记的点

像这种“与一点有关的所有路径的所有点”,可以通过传递闭包后转化为“与一点走一条边有关的所有点”来简化,这就是为啥后面的分析是基于G

然后蓝书上path的具体构造方案其实就是上一页证明里面的构造方案(二分图中的匹配边都选上)

我们是怎么想到最开始选终点的?我们考虑传递闭包之后的图,一般长成这个样子

我们选择点,似乎是往终点选择更好,所以我们最开始先选上所有终点

然后我们让所有终点向前(注意是向前,不是向后)走一条边(注意这个边都是指G的边,而不是G的),就有了蓝书的第三步

然后蓝书说的e所在的路径pe指的是path中的一条路径pe;由于path是不相交的,所以对于Enext(E)的每个节点的pe都是没有重复的点的

然后蓝书说的反证就是如果找不到e,那么E中的某一点就可以到达pe的起点,然后就可以把这两条路径给接起来,让path减少

注意next(E)在以上过程中是一直不变的,即就是最开始选的所有终点走一条边所求出来的next(E)

然后最后我们证明一下最终的点集是符合题意的

首先,在最终的点集中,对于没有更换的点(即最开始就选出来的终点),他们走一步显然是不能互相到达的,而且也不能到达某一个e(任意一个e都不在next(E)中,而现在由于最开始选出来的终点变少了,如果现在让这些终点走一条边形成一个集合next(E),那么这肯定是next(E)的子集,所以e也不会是next(E)中的某一个元素)

然后对于某一个e,如果他能到达某一个没有更换的点,那么他肯定能到达next(E)中的某一个点,这就矛盾了。如果某一个e可以到达另一个e,那么前者一定能到达后者在其pe上的终点,也就能到达next(E),也矛盾了

所以最终的点集是符合题意的

update 2024.8.24

蓝书的构造方法的证明有逻辑漏洞(这个构造方法不知道对不对,但是证明是不正确的):从蓝书提供的代码来看,不应该是重复步骤3 ~ 4,而是应该重复步骤2 ~ 4,也就是说next(E)是要变化的,那么完全有可能,y0是被一条路径P的中间某个点到达的,而不是P的终点到达的,所以y0这条路径就不能被替代

但是不看构造的话,题目给出的结论是正确的。

反链:偏序集中的一个子集B,满足B中任意两个元素都不可比,即任意非空子集都不是全序集

Dilworht定理:对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目。此定理的对偶形式亦真,它断言:对于任意有限偏序集,其最长链中元素的数目必等于其最小反链划分中反链的数目。

这道题目肯定就是求最大反链了,而最小链划分肯定就是求最小路径点覆盖了,于是结论正确

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示