手把手带你熟悉Dijkstra算法

Rohana ·
更新时间:2024-11-13
· 811 次阅读

伪代码 //u是源节点 Initialization: N' = {u} for all nodes v if v is a neighbor of u then D(v) = c(u,v) e1se D(v) =∞ Loop find w not in N' such that D(w) is a minimum add w to N' update D(v) for each neighbor v of w and not in N': D(v) = min(D(v) , D(w) + c(w,v)) //new cost to v is either old cost to v or known 1east path cost to w plus cost from w to v until N'= N 例题

如下图,源点选为u。
在这里插入图片描述

STEP1

已并入结点:{u}

初始化列表:

结点 最短距离 路径
v 2 {u, v}
w 5 {u, w}
x 1 {u, x}
y null
z null
STEP2

接下来,找距离u最近的一个结点,那就是x了!
已并入结点:{u, x}

结点 最短距离 路径
x 1 {u, x}
v 2 min(d(u, v), d(u, x)+d(x, v)) = min(2, 3) => {u, v}
w 4 min(d(u, w), d(u, x)+d(x, w)) = min(5, 4) => {u, x, w}
y 2 {u, x, y}
z null
STEP3

接下来,找距离u最近的一个结点,那就是v了!
已并入结点:{u, x, v}

结点 最短距离 路径
x 1 {u, x}
v 2 {u, v}
w 4 min(d(u, x, w), d(u, v)+d(v, w)) = min(4, 5) => {u, x, w}
y 2 {u, x, y}
z null
STEP4

接下来,找距离u最近的一个结点,那就是y了!
已并入结点:{u, x, v, y}

结点 最短距离 路径
x 1 {u, x}
v 2 {u, v}
y 2 {u, x, y}
w 3 min(d(u, x, w), d(u, x, y)+d(y, w)) = min(4, 3) => {u, x, y, w}
z 4 {u, x, y, z}
STEP5

接下来,找距离u最近的一个结点,那就是w了!
已并入结点:{u, x, v, y, w}

结点 最短距离 路径
x 1 {u, x}
v 2 {u, v}
y 2 {u, x, y}
w 3 {u, x, y, w}
z 4 min(d(u, x, y, z), d(u, x, y, w)+d(w, z)) = min(4, 8) => {u, x, y, z}
结果

以u为单源节点,到达其他各个结点的最短路径及其代价是:

结点 最短距离 路径
v 2 {u, v}
w 3 {u, x, y, w}
x 1 {u, x}
y 2 {u, x, y}
z 4 {u, x, y, z}
编程实现

《实现图论的Dijkstra算法和Prim算法(Python语言描述)》

实践性实验

《Dijkstra算法解决欧洲旅行问题(Java语言描述)》


作者:进阶的JFarmer



dijkstra

需要 登录 后方可回复, 如果你还没有账号请 注册新账号