以下是Dijkstra算法的白话版 ,原文链接:点这里带你过去
以D为起始点,A为中点,目标是实现从D到A经过每一个节点然后找出路程最短的走法。
Dijkstra算法的实现:
先准备两个集合一个叫做S一个叫做U
S里面存的是走过的节点
U里面存的是没走过的点
1.对于这个图,既然把D当做了起点那就把D点当做已经走过的点存到S里
所以,现在:
S={D}
U={A,B,C,E,F,G}
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}
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}
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}
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}
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
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算法更容易被理解,同时也能让看看我理解的对不对,不对的地方还请各位大佬不吝赐教 评论或私聊都可以,如有侵权私聊删!