【题解】P4768 [NOI2018] 归程 / Kruskal 重构树

补补以前懒得总结的零碎东西。

kruskal 重构树

使用条件:求无向图中两点之间所有路径的最大边权的最小值

构造:

  1. 依 kruskal 得到最小生成树

  2. 从小到大考虑生成树中的边 (u,v)

  3. 对于 (u,v),新建一个结点,作为重构树中 u,v 的父结点

  4. 该结点的点权为 (u,v) 的边权

性质:

  1. 原图中两点之间所有路径的最大边权的最小值

    = 最小生成树上两点之间路径的边权最大值

    = 重构树两点 lca 的点权

  2. kruskal 重构树是一棵二叉树

  3. kruskal 重构树以最小生成树构造时为大根堆,反之同理

  4. v 该结点为重构树上 u 深度最浅的点权不超过 w 的祖先结点,则原图中结点 u 经过边权不超过 w 的边能到达的结点为 v 的子树

求最小边权的最大值同理。

思路

Kruskal 重构树。

首先意识到只经过海拔不超过定值的点可以通过 Kruskal 重构树的子树表示,答案即为子树中任意一个结点到 1 号结点经过的积水边总长的最小值。

发现其实等价于子树中结点到 1 号结点的最短路,原因考虑答案路径上最后一个非积水边的终点在所求子树内。

求子树的根结点可以考虑树上倍增。

单次时间复杂度 O(nlogn).

代码

posted @   kymru  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示
主题色彩