Kruskal重构树
Kruskal重构树,即与瓶颈树类似,kurskal重构树的特性是,任意两点之间的简单路径种的(最大或最小)边权值为其最近公共祖先
Kruskal算法
首先给出一张有向图,让我们求最小生成树(用总权值最小的一些边的集合,使得所有点都能互通,很明显n个点会有n-1条边)
kruskal算法思想是先把所有的边按权值大小排序,得到这个样子
然后从小往大依次取边,如果加上这条边和之前的边构成了环,就舍弃这条边,不然就加上,直至取得n-1条边,构成一棵树
例如此图,我们按照权值加完前四条边
在加入第五条边时,我们发现原图出现了环,我们就舍弃这条边
就这样一直加边,直至构成一棵完整的树
这就是kruskal算法的
Kruskal重构树
那么什么又是kruskal重构树呢?
kruskal重构树其实就是把这张图重建成一个二叉树,原图中所有的叶子节点都为原图中的点
其他点都有一个点权w,代表从左集合到右集合的路径,由于重构树是在kruskal的基础上完成的,所以我们必然可以得到一个自下而上点权不降的二叉树
比如我们还用上图距离,建一颗重构树
首先我们合并6,7两个集合,把他们两个连接到一个虚点上,该点权值为他们的边权
(红色代表虚点,白色代表原图的点)
然后我们依次2-8 , 5-6
就这样把这颗二叉树建完
最后重构树大概长这样
这棵树有很多独特的性质
就比如我们想知道从节点2到7路径的最大边权是多少,其实就是他们公共祖先这个虚点的点权值
再比如我们想知道从某个点出发,给出一个值,在通过所有边的权值都小于等于这个值时,我们走过多少个点,其实就等于这个点一直往上面找,找到最后一个小于等于这个值的虚点,他的子树的点我们都是可以通过的(因为从上到下点权不上升)
以上这种问题我们都可以通过在重构树上倍增的方式,把时间复杂度压到logn
例题:
P9235 [蓝桥杯 2023 省 A] 网络稳定性 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
首先,我们需要重构一棵kruskal最大树,那么由于重构书的性质,我们先把最大的连接上,然后依次递减连接,这样我们走得就是最大生成树,对于任意两点之间的距离,其lca肯定是简单路径中边权最小得最大值,因为我们排过序了
P2245 星际导航 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个就是求最小生成树kurskal重构树了
维护一下父节点的值,然后倍增的跳就行,不要问我为什么要倍增,因为会超时呜呜呜
P1967 [NOIP2013 提高组] 货车运输 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
__EOF__

本文链接:https://www.cnblogs.com/o-Sakurajimamai-o/p/18111614.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?