看图秒懂Dijkstra算法 2021-10-06更新

本文以白话形式阐述Dijkstra算法,通过实例一步步展示如何找到从节点D到节点A的最短路径,包括节点加入集合S和U的操作过程。最终得出最短路径D->C->E->F->G->F->B->A,总距离为60。
摘要由CSDN通过智能技术生成

以下是Dijkstra算法的白话版 ,原文链接:点这里带你过去

以D为起始点,A为中点,目标是实现从D到A经过每一个节点然后找出路程最短的走法。
在这里插入图片描述
Dijkstra算法的实现:
先准备两个集合一个叫做S一个叫做U
S里面存的是走过的节点
U里面存的是没走过的点
1.对于这个图,既然把D当做了起点那就把D点当做已经走过的点存到S里
所以,现在:
S={D}
U={A,B,C,E,F,G}
图1


2.此时D已经确定,寻找最短路径中的下一个节点,因为这个图里面只有C和E节点是与D相连的而其他节点可以看做是距离D点无限远,分别尝试走到C和E,比较CD和ED的距离,所以有:

C->D:
C->D=3
C->E->D=5+4=9
...
min(C->D)=C->D=3

C->D=3

E->D:
E->D=4
E->C->D=5+3=8
...
min(E->D)=E->D=4

E->D=4
3<4,所以C是最短路径上的节点,然后存进集合S里
所以,现在:
S={D,C}
U={A,B,E,F,G}
图2


3.此时D,C已经确定,继续寻找最短路径中的下一个节点,B,F,E均可以到达C,同样其他节点可以看做是距离D点无限远,尝试走B,F,E,比较B->D,F->D,E->D的距离,所以:

B->D:
B->C->D=10+3=13
B->F->C->D=7+6+3=16
B->F->E->D=7+2+4=13
...
min(B->D)=B->C->D=13

B->D=13

F->D:
F->C->D=6+3=9
F->E->D=2+4=6
F->C->E->D=6+5+4=15
...
min(F->D)=F->E->D=6

F->D=6

4<6<13,所以E是最短路径上的节点,然后存进集合S里
所以,现在:
S={D,C,E}
U={A,B,F,G}
图3


4.此时D,C,E已经确定,继续寻找最短路径中的下一个节点,F,G均可以到达E,同时对于节点E来说与其相邻的节点C已经走过了所以也可以把节点C的相邻节点看做是E的间接相邻节点,而其他未到达的节点依然可以看做是距离D点无限远,尝试走B,F,G,比较B->D,F->D,G->D的距离,所以:
F->D=6
B->D=13

G->D:
G->E->D=8+4=12
G->E->C->D=8+5+3=16
G->F->E->D=9+2+4=15
G->F->C->D=9+6+3=18
...
min(G->D)=G->E->D=12

G->D=12

6<12<13,所以F是最短路径上的节点,然后存进集合S里
所以,现在:
S={D,C,E,F}
U={A,B,G}
图4


5.此时D,C,E,F已经确定,继续寻找最短路径中的下一个节点,A,B,G均可以到达F,同样其他节点可以看做是距离D点无限远,尝试走A,B,G,比较A->D,B->D,G->D的距离,所以:
B->D=13
G->D=12

A->D:
A->B->C->D=12+10+3=25
A->F->C->D=16+6+3=25
A->F->E->D=16+2+4=22
A->G->E->D=14+8+4=26
...
min(A->D)=A->F->E->D=22

A->D=22

12<13<22,所以G是最短路径上的节点,然后存进集合S里
所以,现在:
S={D,C,E,F,G}
U={A,B}
图5


6.此时D,C,E,F,G已经确定,继续寻找最短路径中的下一个节点,此时注意并不是只有A节点才可以到达G了,因为对于G节点来说与其相邻的F节点已经纳入了最短路径中了所以与G相邻的节点也可以看做与F相邻的节点,所以B节点也入选,尝试走A,B,比较A->D,B->D的距离,所以:
A->D=22
B->D=13
13<22,所以G是最短路径上的节点,然后存进集合S里
所以,现在:
S={D,C,E,F,G,B}
U={A}
因为从节点G到节点B要再经过节点F一次,所以最短路径可以记为:D->C->E->F->G->F->B
图6


7.最后把U集合中最后的A节点存入集合S就大功告成了!
所以,现在:
S={D,C,E,F,G,B,A}
U={}
在这里插入图片描述
最短路径:D->C->E->F->G->F->B->A
其距离就是把这些节点相连的边加起来【X(w)即为节点 X 到D节点的最短距离为w】:
D(0)+C(3)+E(4)+F(6)+G(12)+B(13)+A(22)=60


本篇文章只是在看完原作者博文后的一个关于我自己的理解,希望能通过这篇文章让Dijkstra算法更容易被理解,同时也能让看看我理解的对不对,不对的地方还请各位大佬不吝赐教 评论或私聊都可以,如有侵权私聊删!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值