福建WC2014 路径权值(Kruskal重构树 + 树状数组)
题目描述:
给定一个带权树,树上任意两点间的路径权值 定义为 这两个点之间路径上的最小值,树上任意一点 的权值定义为这个点到树上其他所有点的路径权值和,即 ,现求树上每一个点的路径权值和。
Input Format
首先输入一个整数 ,表示树的点的个数。
接下来 行,每行三个整数 ,表示编号为 的节点和编号为 的节点之间存在一条权值为 的边,树上每个点的编号为
Output Format
n行,每行输出每个节点对应的路径权值和
Sample Input
Sample Output
思路:
首先明确要求的是一个 的所有路径的最小权值,而树链剖分是求两点路径上的最小 边权或点权行不通。要知道路径的最小值,还可以用 Kruskal重构树 来解决,根据重构树的重要性质可以知道,树上任意两点的最短路径的权值就是这两点在重构树上的 ,那么就可以在 的时间复杂度下快速求出路径权值。
如果是一个点一个点的去计算过去,就会是 的复杂度很明显是会超时的。就要考虑如果优化掉每一次枚举的 的瓶颈。由于原来最大生成树的所有点在重构树中都是叶子节点,其余所有的节点都是代表着原来生成树中的边权。根据这一点可以知道,任何一个节点要到另一个节点一定是从左(右)子树经过该子树的根节点走向右(左)子树的,所以每一个非叶子节点都会对以它为根的子树中所有的节点产生 的贡献,也就是一个区间加的操作,可以用树状数组或线段树来实现,从而将计算每一个点到其他所有点的路径之和从暴力枚举的 优化成了 。
在计算贡献的时候还需要知道左右子树的大小,所以还需要遍历一遍重构树来计算出每一棵子树的大小,左子树中所有的叶子节点都可以到右子树中,所以右子树对左子树的贡献就是 左子树同理。总的时间复杂度为 ,省去了每一次要求两点 的 。
完整代码
__EOF__

本文链接:https://www.cnblogs.com/Haven-/p/16855777.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框架的用法!