一、Dijkstra算法简介
Dijkstra算法是由河南荷兰计算机科学家狄克斯特拉(Dijkstra)于1959年提出的,因此又叫狄克斯特拉算法。
二、初识Dijkstra算法
在使用Dijkstra算法求最短路时,需要用到三个辅助数组:
v i s x vis_x visx:布尔数组,给 x x x 号结点打标记。初始化为 0 0 0。
s t e p x step_x stepx:记录从固定起点到 x x x 号结点的最短路径,初始化为 + ∞ +\infty +∞。
p r e x pre_x prex:记录 x x x 号结点的前一个结点,如果不理解前一个结点是什么意思,第三部分模拟过程中会讲解。
三、模拟Dijkstra算法求最短路径长度
首先看下面的图5。
图5
假设我们要求从 0 0 0 号结点到 4 4 4 号结点的最短距离,下面是模拟过程:
- 初始化 v i s vis vis 和 s t e p step step 数组,记录起点 s t e p 0 = 0 step_0=0 step0=0;
- 找到目前未被标记的 s t e p step step 值最小的结点 0 0 0,标记 v i s 0 = 1 vis_0=1 vis0=1, 0 0 0 号结点的邻接点有 1 1 1 和 7 7 7,边权分别为 4 4 4 和 8 8 8,记录 s t e p 1 = m i n ( s t e p 1 , s t e p 0 + 4 ) = 4 step_1=min(step_1,step_0+4)=4 step1=min(step1,step0+4)=4, s t e p 7 = m i n ( s t e p 7 , s t e p 0 + 8 ) = 8 step_7=min(step_7,step_0+8)=8 step7=min(step7,step0+8)=8, p r e 1 = 0 pre_1=0 pre1=0, p r e 7 = 0 pre_7=0 pre7=0;
- 找到目前未被标记的 s t e p step step 值最小的结点 1 1 1,标记 v i s 1 = 1 vis_1=1 vis1=1, 1 1 1 号结点的邻接点有 2 2 2 和 7 7 7,边权分别为 8 8 8 和 11 11 11,记录 s t e p 2 = m i n ( s t e p 2 , s t e p 1 + 8 ) = 12 step_2=min(step_2,step_1+8)=12 step2=min(step2,step1+8)=12, s t e p 7 = m i n ( s t e p 7 , s t e p 1 + 11 ) = 8 step_7=min(step_7,step_1+11)=8 step7=min(step7,step1+11)=8,