k 短路 学习笔记

k 短路 学习笔记

PART 1

s s s t t t k k k 短路。

首先,建立出反图中以 t t t 为根的最短路树。则从 s s s t t t 的路径可以分解成树边序列 E t E^t Et 和非树边序列 E E E。(许多博客在此的措辞为“集合”,个人觉得不太准确)

为了方便描述,下面设 E i = ( u i , v i , w i ) E_i=(u_i,v_i,w_i) Ei=(ui,vi,wi)

有这样一个重要性质:若 E E E 确定了, E t E^t Et 即唯一确定了,整条路径就唯一确定了。因为最短路树是一棵树。

若设一条非树边为 e = ( u , v , w ) e=(u,v,w) e=(u,v,w) Δ e = d v + w − d u \Delta_e=d_v+w-d_u Δe=dv+wdu(其中 d u d_u du 为最短路树上 u u u t t t 的距离),则一个非树边序列对应的路径的长度为 d s + ∑ e ∈ E Δ e d_s+\sum_{e\in E}\Delta_e ds+eEΔe

综上,问题转化为了求 Δ e \Delta_e Δe 和第 k k k 小的 E E E

PART 2

什么样的 E E E 是合法的呢?需要满足 1 ≤ i < ∣ E ∣ 1\le i < |E| 1i<E u i + 1 u_{i+1} ui+1 v i v_i vi 的祖先(包括其本身)。

于是我们得出了一个基本的想法:维护可能成为当前最小值 E E E。先选择最小的 E E E,并考虑在它上继续延伸:假设最后一条边为 e = ( u , v , w ) e=(u,v,w) e=(u,v,w),有两种方法进行延伸:

  • e e e 替换成一个合法的、 w w w 更大的 e ′ e' e,“合法”的选择标准和 e e e 当时的选择标准一致)
  • e e e 的后面新添一个 e ′ e' e,为了合法,需要 e ′ e' e 的出发点是 v e v_e ve 的祖先(包括其本身)。

到这里就可以想办法维护了,发现可以用堆维护,但时间、空间都会爆表(大概是 O ( m k log ⁡ ( m k ) ) O(mk\log (mk)) O(mklog(mk)) 级别的东西)。观察我们需要得知 从某个点或其祖先出发的非树边,考虑使用“可持久化可并堆”,维护某个点到根的信息。

PART 3

重新看看两个条件:

假设当前的 E E E 的最后一条边所在的可并堆的节点为 u u u

  • 替换操作,选择标准一致,所以延伸出的节点仍然在这个可并堆中。将 u u u 的左、右儿子加入选择即可。
  • 新添操作,直接将 u u u 对应边的终点对应的可并堆的根加入选择。

每次只会加入 O ( 1 ) O(1) O(1) 个点作为选择,故时间复杂度 O ( m log ⁡ k ) O(m\log k) O(mlogk)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日居月诸Rijuyuezhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值