Dijkstra 最短路动画演示

每次敲定当前最近的那个点,再用它去松弛邻居。

键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端

Dijkstra 的纪律只有一条:从未敲定的点里挑当前距离最小的那个敲定,从此永不回头,再用它给邻居松一次边。这份「贪心」敢这么做,靠的是一个硬引理——边权非负时,任何一条后来绕到已定终点的路只会更长,盖了的章不会被掀翻。这一页把整场博弈摊开:距离表每个节点一行,当前距离与前驱一目了然;每轮「挑人」的比较逐个成步,「比较」与「更新」严格分成两拍。

松弛的写法是算法的心脏:若 d[u]+w(u,v) 比 v 现在的记号小,就改写距离、把前驱指过来——前驱边永久染绿,跑完自然长成一颗最短路树。终点沿前驱往回退,一条最短路径亮在图上。页尾专门交代它的阿喀琉斯之踵:负权边会让「绕路更短」成为现实,盖章失效,得换会反复松弛的 Bellman-Ford;而稀疏大图上的优先队列写法、稠密图反而适合本页的 O(V²) 扫描,这类取舍也写在收尾的说明里。

Dijkstra 最短路演示怎么用

  • 换源点:起点下拉框把源点换成任意字母,距离表与最短路树整体重算,染色口径不变。
  • 分两拍看松弛:每次松弛先弹「比较步」(绕道值对现值),不占优就把边染灰收场,占优才有第二拍「更新步」:改距离、换前驱、染绿一条前驱边。
  • 读距离表:每敲定一个点,其「当前距离」整格转绿盖章;敲定顺序就是当前距离的全序,页面上比较步会一一交代。
  • 回退路径:收尾自动选取离源点最远的点作为终点,沿前驱一格一格倒退回源点,路径长度、距离表的读数与回退链条三方互相对账。

常见问题

Dijkstra 为什么扛不住负权边?

它的正确性押在「已敲定的距离不可能被未来路径改进」上,前提是往后每多走一条边都不减重。负权边一出现,从别处绕路可能瞬间更短,被盖章的点其实还欠着账,整套逻辑瞬间失效;那属于 Bellman-Ford 反复松弛的世界。

敲定为什么是「当前距离最小」而不是「距离最小」?

未敲定点的当前值只是「迄今最好上界」,仍在被各路松弛冲刷;只有其中最小的那个,才不可能被经停别人的路径再压低——因为替代路径必先经过一个不小于它的上界点,加上非负边只会更高。这一步是整个算法的戏眼。

和广度优先搜索是什么关系?

BFS 是边权全相同时的特例:一圈圈出队就是按距离分层。Dijkstra 把「队列」升级成「按当前距离取小的优先队列」,才撑得住不同权重,两者的「访问序 vs 敲定序」结构差异也正在于此。

演示编号 C08无需安装,手机端同样可用按 Ctrl + K 搜工具与演示

顺手能用上的工具