手把手带你熟悉Dijkstra算法

伪代码

//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语言描述)》

发布了738 篇原创文章 · 获赞 1580 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/105058824