k 短路
问题描述
给定一个有
A*算法
A*算法定义了一个对当前状态
在求解
由于设计的距离函数和估价函数,对于每个状态需要记录两个值,为当前到达的结点
开始我们将初始状态
优化:由于只需要求出从初始结点到目标结点的第
当图的形态是一个
实现
可持久化可并堆优化 k 短路算法
最短路树与任意路径
定义
在反向图上从
所谓最短路径树,就是满足从树上的每个结点
性质
设一条从
-
对于一条不在
上的边 ,其为从 到 的一条边,边权为 ,定义其代价 ,即为选择该边后路径长度的增加量。则路径 的长度 。 -
将
和 中的所有边按照从 到 所经过的顺序依次排列,则对于 中相邻的两条边 ,有 与 相等或为其在 上的祖先。因为在 中 直接相连或中间都为树边。 -
对于一个确定存在的
,有且仅有一个 ,使得 。因为由于性质 , 中相邻的两条边的起点和终点之间在 上只有一条路径。
问题转化
性质
性质
性质
那么问题转化为:求
过程
由于性质
我们用一个小根堆来维护这样的边集
初始我们将起点为
每次取出堆顶的一个边集
-
替换
中的最后一条边为满足相同条件的 更大的边。 -
在最后一条边后接上一条边,设
为 中最后一条边的终点,由性质 可得这条边需要满足其起点为 或 在 上的祖先。
将生成的新边集也加入小根堆。重复以上操作
对于每个结点
-
替换
中的最后一条边为 在堆上的左右儿子对应的边。 -
在最后一条边后接上一条新的边,设
为 中最后一条边的终点,则接上编号为 的小根堆的堆顶结点对应的边。
用这种方法,每次生成新的边集只会扩展出最多三个结点,小根堆中的结点总数是
所以此算法的瓶颈在合并一个结点与其在
可持久化可并堆优化
在阅读本内容前,请先了解 可持久化可并堆 的相关知识。
使用可持久化可并堆优化合并一个结点与其在
每次将一个结点与其在
注意的是,如上文所言,最终询问时不需要可并堆的合并操作。
询问时使用优先队列维护可并堆的根,对于可并堆堆顶的删除,直接将其左右儿子加入优先队列中,
就只需要
实现
习题
贡献者:@WenzelTian@Ir1d@wangr-x@mgt@Henry-ZHR@ouuan@雷蒻@Trisolaris
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用