379. 捉迷藏
题目链接
379. 捉迷藏
Vani 和 cl2 在一片树林里捉迷藏。
这片树林里有 座房子, 条有向道路,组成了一张有向无环图。
树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔。
如果从房子 沿着路走下去能够到达 ,那么在 和 里的人是能够相互望见的。
现在 cl2 要在这 座房子里选择 座作为藏身点,同时 Vani 也专挑 cl2 作为藏身点的房子进去寻找,为了避免被 Vani 看见,cl2 要求这 个藏身点的任意两个之间都没有路径相连。
为了让 Vani 更难找到自己,cl2 想知道最多能选出多少个藏身点。
输入格式
输入数据的第一行是两个整数 和 。
接下来 行,每行两个整数 ,表示一条从 到 的有向道路。
输出格式
输出一个整数,表示最多能选取的藏身点个数。
数据范围
输入样例:
输出样例:
解题思路
有向无环图的最小路径点覆盖
路径点覆盖:选择若干条不相交(点不相交)的路径,这些路径可以将所有的点覆盖
最小路径点覆盖:即路径最少的路径点覆盖
结论:
证明:首先要将一个有向无环图转化为一个二分图,不妨拆点:即将一个点拆分为入点和出点,将出点看成二分图的左部,入点看成二分图的右部,原图的所有边都可以转化为二分图的边,由于选择的路经是不相交的,即每个点的出度和入度至多为 ,对应在二分图上,即左部的点向右部连的边是唯一的,即是匹配边,对于一条路径的终点,其出度为 ,对应在二分图即左部的非匹配点,故 即为有向无环图的最小路径点覆盖
扩展:
结论:记原图 ,求传递闭包后的图记为 ,求 的最小路径重复点覆盖等价于求 的最小路径点覆盖
证明:
求 的路径点覆盖 的路径重复点覆盖
传递闭包即对于 ,这时 ,求出 的路径点覆盖后,凡是涉及 这样的边,都扩展开来,即对应 的路径重复点覆盖
求 的最小路径重复点覆盖 的最小路径点覆盖
对于当前路径 ,如果存在重复点 ,即前面有这样的路径 ,则当前路径可以跳过 ,因为 已经被选了,即对应 中含传递闭包的路径
故两者可以互相转换,求 的最小路径重复点覆盖即可转化为求 的最小路径点覆盖
本题要找最多的点,使得两两之间不存在可达的边,设 的最小路径重复点覆盖为 ,则要找的点不可能比 大,因为 的最小路径重复点覆盖包含了所有的点,且每一条路径上最多只能选择一个点,否则由鸽笼原理,一定会存在一条可达的路径,后面构造使得:,将最小重复点覆盖路径的终点的集合即为 ,设 中的所有点可到的点的集合为 ,如果 ,即 中所有的点都到不了 本身的某一个点,即 中所有点互不可达;如果 ,每次选择一条终点可到 的一条路径,不选这个点,往回退选点,所有这样的终点往回退选点,直到 为止,假设存在这样一条路径,其往回退退到起点依然所有的点仍在 中,说明这条路径上的所有的点都可以被覆盖掉,这与最小路径重复点覆盖矛盾,所以这样的方法可行,即一定会有 ,故答案即为最小路径重复点覆盖
- 时间复杂度:
代码
__EOF__

本文链接:https://www.cnblogs.com/zyyun/p/16937058.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!