问题
对于带权有向图,定义路径的长度为经过的边的权值之和。两条路径不同当且仅当经过边的顺序不同。给一个带权有向图 G G G 以及起点和终点 s , t s,t s,t,求 G G G 中 s s s 到 t t t 权值前 k k k 小的路径。
朴素做法
问题转化
定义 d i s x dis_x disx 表示从 x x x 到 t t t 的最短路长度,权值为 w w w 的边 e : u → v e:u\to v e:u→v 的花费 δ ( e ) = d i s v − d i s u + w \delta(e)=dis_v-dis_u+w δ(e)=disv−disu+w
可以理解成若从 u u u 走向 t t t 时,沿着边 e e e 而不是最短路径上的边走,至少需要多走 δ ( e ) \delta(e) δ(e) 的距离。
先求出 G G G 中从 t t t 出发沿着反向边走的最短路树,那么一条从 s s s 到 t t t 的路径 P P P 是由若干条树边和非树边组成。 P P P 的长度可以表示为 l e n ( p ) = d i s s + ∑ e ∈ P δ ( e ) len(p)=dis_s+\sum_{e\in P}\delta(e) len(p)=diss+e∈P∑δ(e)
显然树边 e T e_T eT 满足 δ ( e T ) = 0 \delta(e_T)=0 δ(eT)=0。若令 P ′ P' P′ 为