Skip to content

算法Algorithm

Dijkstra 算法

Dijkstra's algorithm

在非负边权图中逐次确定最短距离的单源最短路算法。

形式陈述 ​

给定有限有向或无向图、源点 s,并假设每条边权 w(e)≥0,Dijkstra 算法维护暂定距离 d[v] 与已结算集合 S。初始化 d[s]=0、其余为 +∞;反复从未结算顶点中取 d 最小者 u;若该键为 +∞,其余顶点均不可达,搜索结束,否则把 u 加入 S,再对每条出边执行松弛

d[v]←min{d[v],d[u]+w(u,v)}.

每个有限 d[v] 都是一条已发现 s⇝v 路的权重,所以 d[v]≥δ(s,v)。源点首次取出时 d[s]=δ(s,s)=0,给出归纳起点。此后假设 S 中距离均已正确,取有限键的最小候选 u。在一条最短 s⇝u 路上令 y 为第一个不在 S 的顶点,x 为它的前驱。松弛 x→y 后已有 d[y]=δ(s,y);非负权又给出 δ(s,y)≤δ(s,u)。由最小键选择,

δ(s,u)≤d[u]≤d[y]=δ(s,y)≤δ(s,u),

故 d[u]=δ(s,u),可以永久结算。这个割论证同时解释了非负权假设出现在哪里。

算法以按键取最小值的优先队列实现。设 n=|V|、m=|E|,并假设邻接表、精确权重加法与比较在单位成本 RAM 中计费:

  • 二叉堆加顶点句柄执行至多 n 次 extract-min、至多 m 次 decrease-key,最坏时间 O((n+m)log⁡(n+1))、额外空间 O(n);
  • 不支持 decrease-key 时可插入新记录并惰性跳过旧记录,从单个源记录开始,总共插入至多 m+1 个堆项,时间 O(n+(m+1)log⁡(m+2))、空间 O(n+m);
  • Fibonacci 堆的摊还操作界给出整个算法确定性最坏总时间 O(m+nlog⁡(n+1));
  • 邻接矩阵配合线性扫描最小未结算键,确定性最坏时间为 Θ(n2)、额外空间 O(n)(不计矩阵本身)。
直觉

Dijkstra 把已结算区看成从源点扩张的距离球。堆中每个键代表一条从球内跨出到该顶点的最佳已知路线;取最小键就是选择下一层边界。由于边权不为负,任何尚未进入球的绕行都不可能先走得更远、再以负代价回来改短已结算点。

松弛负责生成与更新候选,贪心选择负责宣布一个候选不再变化。只做松弛而没有最小键次序,是另一类标签修正算法;只取最小键而不扫描出边,也无法把正确距离传播给后继。

Dijkstra 的取最小与松弛
例子与边界

在边

s→a:2,s→b:5,a→b:1,a→t:4,b→t:1

上,结算 s 后暂定 (d[a],d[b])=(2,5);结算 a 后变为 d[b]=3,d[t]=6;结算 b 后又把 d[t] 降为 4。父指针恢复路径 s→a→b→t,其权重 2+1+1=4。

负边反例不需要负圈。取

s→b:1,s→a:2,a→b:−3,b→t:2.

算法先结算 b 并令 d[t]=3;等到结算 a,真正到 b 的成本才降为 −1。标准算法不会重新展开已结算的 b,于是返回 d[t]=3,而路径 s→a→b→t 的权重是 1。这表明非负性是足够且可局部检查的前提;“图中没有负圈”仍不足以使用本算法。

负权图可改用Bellman–Ford 算法。零权边和零权圈不破坏正确性,但可能产生多个相同键;平局以任意顺序结算都安全。不可达顶点始终为 +∞,实现可在最小键已为无穷时停止。平行边逐条松弛即可,同方向只保留最小权边也不改变距离;非负自环不会改进任何估计。

推论与应用

Dijkstra 解决非负权最短路问题;图表示决定能否只扫描现有边,队列实现决定最小键与减键成本。若只查询一个目标 t,当 t 被取出并结算时即可停止;在此之前仅仅“发现 t”不构成最优性证书。

0–1 BFS在零一边权下用deque保持两个相邻距离层;Dial算法将其推广到有限整数窗口,radix heap再按二进制差异跳过空键域。三者保留本页最小有效键结算的责任,不能因换队列而忽略旧项、键范围或字级成本。单对点查询还可采用双向Dijkstra,在反图同时搜索,保存跨边可行上界并用两队首之和证明停止。

Johnson 算法先用势函数把含负边、无负圈的图重赋为非负权,再逐源调用 Dijkstra。A*在一致启发函数下等价于对约化非负权运行同一结算逻辑;对同一个固定目标和“目标结算即停止”的接口,令启发函数 h≡0,A* 恰好退化为 Dijkstra 的单目标版本;特例关系采用这一共同接口。完整单源版本继续搜索其他可达顶点。

参考资料
  • Edsger W. Dijkstra, “A Note on Two Problems in Connexion with Graphs,” Numerische Mathematik 1, 1959, pp. 269–271。
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,§22.3。
  • Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,§4.4。
关系图谱26 个相邻概念 · 5 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置
类型化关系