从暂定距离开始
算法给源点设置距离零,给其他顶点设置尚不可达的无穷大标记。处理某个顶点u时,检查经由它再走一条边到v,是否比当前已知的v距离更短;若更短,就更新距离并记录对应前驱。
这一步称为松弛,比较的是从源点出发的累计边权,而不是只选局部最便宜的一条边。前驱记录可以在计算后恢复路径;目标始终不可达时,也应保留不可达状态,不能把没有路径误当作费用为零。
参考:[1]
非负权重支持逐次确定
标准方法反复取出暂定距离最小的未确定顶点,并把它纳入已经确定最短距离的集合。由于其余边权不为负,尚未处理的绕路不能再把这个最小值降低,因而可以继续向后推进。
优先队列帮助寻找当前最小候选,距离变小时还须同步更新相应键或按实现规则处理旧记录。边权允许为零,但不能把标准非负权重保证直接用于任意负边输入;不同的修改算法需要各自重新说明正确性与复杂度。
数据结构与目标范围影响成本
邻接表配合适当的二叉堆优先队列,可以把主要工作控制在O((V+E)log V)的常见上界内;比较代价、初始化和所访问的边,都属于完整实现的成本。对稠密图或其他优先队列,具体界限可能采用不同形式。
只查询单个目标时,可以在其最短距离真正被确定后结束,而不是在第一次看到它时立即停下。算法优化的是模型规定的边权总和;若权重表达时间、费用或其他量,输入也必须保持与这个目标一致的含义。
参考:[1]