[NOI2018] 归程

该博客介绍了如何运用Kruskal重构树解决一个在线最大生成树问题,涉及动态规划和求解特定点子树到1号点最短路的最小值。在给定无向图和海拔条件的询问下,通过建立重构树并利用倍增或二分查找找到关键点u,简化了问题的解决过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目大意

给定一张无向图,每条边有一个海拔 a a a,每次询问一个 v v v p p p 表示起点和水位。可以从起点开始先花费 0 0 0 到达任意点,条件是不经过 a ≤ p a\le p ap 的边。如果必须要经过这样的边,那么在进入这条边的端点开始,经过每条边的花费就是其长度。求 v → 1 v\to 1 v1 的最小花费是多少。

Solution

题意非常神必,还强制在线。

不过有一个很直观的想法就是做最大生成树。现在我介绍一下最大生成树的思路:

首先跑最大生成树,然后以每次询问可以分成两种情况:

  • 水位没有超过 v → 1 v\to 1 v1 路径上的最小值,那么可以直接到达,输出 0 即可;
  • 水位超过了 v → 1 v\to 1 v1 路径上的最小值,此时我们需要知道一个点 u u u,表示从 v v v 1 1 1 路径上最后一个可以 0 0 0 费到达的点,也就是说 e d g e : u → f a u edge:u\to fa_u edge:ufau 这条边的 a a a 是前面所有经过的边中第一个小于等于 p p p 的。那换句话说,我们可以 0 0 0 费到达 u u u 的子树中的任意一点。那很显然答案就是所有在 u u u 的子树中的点到 1 1 1 的最短路的最小值。

现在我们考虑解决上面提到的若干需求。

求路径最小值

这个很简单,做一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值