Dijkstra 演算法的手動分析

漫舞八月(Mount256)發表於2024-06-11

目錄
  • Dijkstra 演算法
    • step0. 初始狀態
    • step1. 第一輪
    • step2. 第二輪
    • step3. 第三輪
    • step4. 第四輪

Dijkstra 演算法

以下面有向圖為例:

graph LR V0((V0)) -- 10 --> V1((V1)) V0((V0)) -- 5 --> V4((V4)) V1((V1)) -- 2 --> V4((V4)) V4((V4)) -- 3 --> V1((V1)) V1((V1)) -- 1 --> V2((V2)) V4((V4)) -- 9 --> V2((V2)) V4((V4)) -- 2 --> V3((V3)) V3((V3)) -- 7 --> V0((V0)) V3((V3)) -- 6 --> V2((V2)) V2((V2)) -- 4 --> V3((V3))

step0. 初始狀態

  • final 陣列:標記各頂點是否已找到最短路徑
V0 V1 V2 V3 V4
True False False False False
  • dist 陣列:記錄從源點(V0)到該點(Vi)的最短路徑長度
V0 V1 V2 V3 V4
0 10 5
  • path 陣列:路徑上的前驅(前面的結點)
V0 V1 V2 V3 V4
-1 0 -1 -1 0

step1. 第一輪

【1】找到 step0 中 :final 陣列還未確定的最短路徑,且在 dist 陣列中最小的頂點 Vi = V4,令 final[i] = True。

  • final 陣列:
V0 V1 V2 V3 V4
True False False False True

【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 陣列:
V0 V1 V2 V3 V4
0 8 14 7 5
  • path 陣列:
V0 V1 V2 V3 V4
-1 4 4 4 0

step2. 第二輪

【1】找到 step1 中 :final 陣列還未確定的最短路徑,且在 dist 陣列中最小的頂點 Vi = V3,令 final[i] = True。

  • final 陣列:
V0 V1 V2 V3 V4
True False False True True

【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 陣列:
V0 V1 V2 V3 V4
0 8 13 7 5
  • path 陣列:
V0 V1 V2 V3 V4
-1 4 3 4 0

step3. 第三輪

【1】找到 step2 中 :final 陣列還未確定的最短路徑,且在 dist 陣列中最小的頂點 Vi = V1,令 final[i] = True。

  • final 陣列:
V0 V1 V2 V3 V4
True True False True True

【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 陣列:
V0 V1 V2 V3 V4
0 8 9 7 5
  • path 陣列:
V0 V1 V2 V3 V4
-1 4 1 4 0

step4. 第四輪

【1】找到 step2 中 :final 陣列還未確定的最短路徑,且在 dist 陣列中最小的頂點 Vi = V2,令 final[i] = True。

  • final 陣列:
V0 V1 V2 V3 V4
True True True True True

【2】檢查所有鄰接自 Vi = V2 的點(對應 dist = 9,path = 1),若其 final 值為 False,則對比 step2 中的 dist 資訊,如果找到的路徑比當前的資訊還小,則更新其 dist 和 path 資訊。

已經找不到其他未訪問結點,演算法結束,以下為最終結果:

  • dist 陣列:
V0 V1 V2 V3 V4
0 8 9 7 5
  • path 陣列:
V0 V1 V2 V3 V4
-1 4 1 4 0

相關文章