CF1253F Cheap Robot 做题记录

给定一张 nn 个点 mm 条边的无向图和一个正整数 kk,边有边权表示机器人经过这条边消耗的电量,点 1,2,3,,k1,2,3,\dots,k 为充电中心。机器人可以在充电中心免费充满电。

qq 组询问,每次给定两个节点 s,ts,t,保证 1s,tk1\le s,t\le k。你需要求解以下问题:

  • 若有一个机器人从 ss 出发,它的电池容量至少为多少才能顺利到达 tt

1n,m,q3×1051\le n,m,q\le 3\times 10^5

首先有一个敏锐的观察,发现 1s,tk1\le s,t\le k 很有用,这意味着有一个策略是每到达一个新的点就去最近的充电中心充一次电是不劣的。

观察出这个结论后,直接求出 disudis_u 表示 uu 到最近充电站的距离,那么对于一条路径 EE,电池容量至少为 max(u,v,w)E{disu+disv+w}\max\limits_{(u,v,w)\in E}\{dis_u+dis_v+w\}

那么做法就很显然了,求出 disudis_u 后把边 (u,v,w)(u,v,w) 变成 (u,v,w+disu+disv)(u,v,w+dis_u+dis_v),跑一遍 Kruskal 重构树即可。

时间复杂度 O((n+m)logn)O((n+m)\log n)