- Dijkstra 演算法
- step0. 初始狀態
- step1. 第一輪
- step2. 第二輪
- step3. 第三輪
- step4. 第四輪
Dijkstra 演算法
以下面有向圖為例:
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 |