数据结构与算法演示台SUANFA.NET.CN · STEP BY STEP

图 · 单步演示

Dijkstra 最短路

求一个起点到其余各顶点的最短距离。每一步从还没确定的顶点里挑 dist 最小的一个,认定它的距离不会再变,再用它去更新邻居的 dist。要求所有边权都不小于 0。

写成 A-B:4(带权)或 A-B(权按 1 算),逗号或空格隔开;最多 10 个顶点、20 条边,权为 0 到 999。 输入只在你的浏览器里计算,不会上传。

4215810263A0BCDEF
待定且已可达(dist)A(0)
确定顺序(空)

步 001 / 032起点 A 的 dist 设为 0,其余都是 ∞。

键盘: 单步,空格 播放/暂停(先点一下演示区)。

伪代码 · 当前行高亮

  1. dist[*] ← ∞;dist[s] ← 0
  2. while 还有未确定的顶点
  3. u ← 未确定顶点中 dist 最小的;若 dist[u] = ∞ 则结束
  4. 确定 u
  5. for (v, w) in u 的邻边,v 未确定
  6. if dist[u] + w < dist[v]
  7. dist[v] ← dist[u] + w;prev[v] ← u

变量

u
distA:0 B:∞ C:∞ D:∞ E:∞ F:∞
已确定[]

复杂度

最好情况O(V²)
平均情况O(V²)
最坏情况O(V²)
额外空间O(V)

本演示每轮扫一遍所有顶点找最小值,共 V 轮,所以是 O(V²),适合稠密图。换成二叉堆维护待定顶点,可以做到 O((V + E) log V)。

要点

  • 「确定」的依据:所有边权非负时,从已确定区域往外走只会让距离变大,当前最小的 dist 不可能再被别的路径改小。
  • prev 数组记下每个顶点是从谁更新来的,倒着追回去就是路径。

常见错误

有负权边时,已经「确定」的顶点之后还可能被改小,结果会出错。本演示遇到负权会直接拒绝。

同一类的其他演示