支配树(灭绝树) 学习笔记
前言
在飞机上的时候理解了一下这个算法,这里写一下吧。本来以前一直以为是个算法(其实也是),结果发现一些证明还是很有意思的。
前置定义
对于一个给定图,我们有如下定义:
- 支配点
我们称为的支配点当且仅当在原图中删去之后从根节点出发无法抵达。
- 半支配点
我们称为的半支配点当且仅当存在一条到的路径使得该路径除去所有节点的都大于,且在满足条件的点集中最小。
为了方便,我们称点的半支配点为,支配点为。
支配树思想
这个算法主要是解决支配之类的问题。例如一个点支配多少个点,一个点被多少个点支配之类的。
对于这个问题我们可以建起一棵树,满足点支配的点都在的子树内。
于是问题就是如何建起一棵支配树,据说这个还叫灭绝树(奇怪的名字增加了!!!)
- 树
很显然,对于一棵树,该树的支配树就是它本身。
很显然,我们可以直接把点连在的下面,其中存在边。
时间复杂度。
例题: [ZJOI2012]灾难
- 任意图
对此,我们老爷子和提出了一种名为的算法,可以在的时间复杂度内建好树,当然,更确切的来说是。
我们发现似乎我们直接求支配点不是很好求,我们考虑如何求出半支配点。
我们发现对于当前节点,如果有边,且,那么在不考虑最小的情况下,一定为的半支配点。
证明直接感性一下,发现显然,直接根据定义就可以知道正确性。
而且半支配点还有一个性质,就是一个点的半支配点的一定不会比该点大,这个下面的性感证明会用到,但是我似乎并没有写出来,读者明白就好。
然后这里就有一个的方法诞生了。我们发现如果删掉原图中非树的边,再对于,连上,不会改变原图的支配关系。
正确性这里感性证明一下,对于,如果在原图中并不支配,那么,如果在树中不是的祖先,那显然满足,否则的话,我们可以从走到。如果原图中支配的话,很显然,在树中是的祖先,因为无论怎么走都得先经过。那么显然还支配。
于是,我们就把这个图变成了一个,就可以用上面的方法做出来了。
但是,这并不满足我们对代码复杂度的渴望。一个小小的思想在我们脑海中划过:我们是否可以用求出?答案是肯定的。为了方便,我们假设我们已经把图变成一个了。
我们分两种情况考虑:
我们设为路径上最小的点
- 如果
则
这个应该很显然吧。。。性感理解的话就是因为不可能有其他点通过边走到的路径上,因为这条路径上最小值也不过。
- 否则
我们采用反证法来感性证明一下:
我们假设删去之后仍可达,那么说明的某个祖先可以通过边走到这条路径上的某个点,但是我们发现必定是的后代,而这条路径上最小也不过,所以矛盾,证毕。
于是,我们可以用并查集维护中的最小值,我们就在的时间复杂度内解决了建树的问题。
对了,还有最后的一个问题没有解决,可能细心的读者已经发现了(似乎也木有什么读者),我们并没有说明一个点支配的点都在支配树的子树内。其实很好说明,我们发现我们全都是用的最小的点,这就满足充分性。
这个题确实就是板题,就是建出支配树后求出子树大小。
题目大意#
给出一个个点条边的带权无向图,给定起点,求出一个点使得删去该点之后最短路变化的点数最多。
思路#
这道题其实还是比较妙的。
我们不难想到先对原图建出一个最短路径图,于是一个点删去产生的贡献就是该图中支配的点数。这个仔细想一下就会明白为什么。
我们发现这个最短路径图一定是个,因为里面如果有环的话就不是最短路径图了,于是我们就可以直接用解决。
于是我们就在的时间复杂度内解决了这个问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现