Dijkstra 算法的手动分析

Dijkstra 算法

以下面有向图为例:

10
5
2
3
1
9
2
7
6
4
V0
V1
V4
V2
V3

step0. 初始状态

  • final 数组:标记各顶点是否已找到最短路径
V0V1V2V3V4
TrueFalseFalseFalseFalse
  • dist 数组:记录从源点(V0)到该点(Vi)的最短路径长度
V0V1V2V3V4
0105
  • path 数组:路径上的前驱(前面的结点)
V0V1V2V3V4
-10-1-10

step1. 第一轮

【1】找到 step0 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V4,令 final[i] = True。

  • final 数组:
V0V1V2V3V4
TrueFalseFalseFalseTrue

【2】检查所有邻接自 Vi = V4 的点,若其 final 值为 False,则对比 step0 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

对于 V1(原本 dist = 10, path = 0):final 值为 False,从 V0–>V4–>V1 的路径长度为 5+3=8<10,所以需要更新其 dist =8,path = 4;

对于 V2(原本 dist = ∞, path = -1):final 值为 False,从 V0–>V4–>V2 的路径长度为 5+9=14<∞,所以需要更新其 dist =14,path = 4;

对于 V3(原本 dist = ∞, path = -1):final 值为 False,从 V0–>V4–>V3 的路径长度为 5+2=7<∞,所以需要更新其 dist =7,path = 4。

  • dist 数组:
V0V1V2V3V4
081475
  • path 数组:
V0V1V2V3V4
-14440

step2. 第二轮

【1】找到 step1 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V3,令 final[i] = True。

  • final 数组:
V0V1V2V3V4
TrueFalseFalseTrueTrue

【2】检查所有邻接自 Vi = V3 的点(对应 dist = 7,path = 4),若其 final 值为 False,则对比 step1 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

对于 V0:final 值为 True。

对于 V2(原本 dist = 14,path = 4):final 值为 False,从 V0–>V4–>V3–>V2 的路径长度为 7+6=13<14,所以需要更新其 dist =13,path = 3。

  • dist 数组:
V0V1V2V3V4
081375
  • path 数组:
V0V1V2V3V4
-14340

step3. 第三轮

【1】找到 step2 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V1,令 final[i] = True。

  • final 数组:
V0V1V2V3V4
TrueTrueFalseTrueTrue

【2】检查所有邻接自 Vi = V1 的点(对应 dist = 8,path = 4),若其 final 值为 False,则对比 step2 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

对于 V2(原本 dist = 13,path = 3):final 值为 False,从 V0–>V4–>V1–>V2 的路径长度为 8+1=9<13,所以需要更新其 dist =9,path = 1。

对于 V4:final 值为 True。

  • dist 数组:
V0V1V2V3V4
08975
  • path 数组:
V0V1V2V3V4
-14140

step4. 第四轮

【1】找到 step2 中 :final 数组还未确定的最短路径,且在 dist 数组中最小的顶点 Vi = V2,令 final[i] = True。

  • final 数组:
V0V1V2V3V4
TrueTrueTrueTrueTrue

【2】检查所有邻接自 Vi = V2 的点(对应 dist = 9,path = 1),若其 final 值为 False,则对比 step2 中的 dist 信息,如果找到的路径比当前的信息还小,则更新其 dist 和 path 信息。

已经找不到其他未访问结点,算法结束,以下为最终结果:

  • dist 数组:
V0V1V2V3V4
08975
  • path 数组:
V0V1V2V3V4
-14140
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值