今天曾洋老師教了有關於圖的最短路徑問題,現在對例子進行一個自己的理解和整理:
題目:
要求:變成計算出給出結點V1到結點V8的最短路徑
答:
首先呢,我會先通過圖先把從V1到V8的各種路徑全部計算下來,如下:
(1)v1 -> v4 -> v5 -> v3 -> v8 => 1+12+38+8=59
(2)v1 -> v4 -> v5 -> v7 -> v8 => 1+12+24+20=57
(3)v1 -> v6 -> v5 -> v7 -> v8 => 50+1+24+20=95
(4)v1 -> v6 -> v7 -> v8 => 50+12+20=82
(5)v1 -> v2 -> v3 -> v8 => 6+43+8=57
(6)v1 -> v2 -> v5 -> v3 -> v8 => 6+6+38+8=58
(7)v1 -> v2 -> v5 -> v7 -> v8 => 6+6+24+20=56(最短路徑)
(8)v1 -> v2 -> v4 -> v5 -> v3 -> v8 => 6+11+12+24+20=75
(9)v1 -> v2 -> v4 -> v5 -> v7 -> v8 => 6+11+12+24+20=73
從上面列出來的路徑中,很清楚的看到(7)的路徑數是最短的,那么,下面我們通過Dijkstra算法來確定從V1到其他數之間的最小距離分別是多少
步驟一:
先定義兩個數組:
f:表示判斷是否已經找到最短路徑,1表示找到,0表示暫且沒找到
d:表示當前最短路徑
首先,從V1開始,f的第一個一定是1,因為它與它本身的距離一定是最短的(無距離)
d的第一個一定是0,因為V1和V1無算數概念可言,
接着V1分別與其他路徑進行計算,必須是直接路徑才算,不是直接路徑的只能算是無窮大
(例如題中,V1到V2的距離為6,那么在d的數組中的距離就放入6,而V1到V3沒有直接到達,需要經過V2,所以只能是無窮大)
如圖所示:
步驟二:
在輸入完V1到其他數字的距離后,我們開始看d中的數字,在d的數組中,最小的數字為V4對應的1
那么,我們就把d中的V4為結點,把它相對應在f的位置從0改成1,(在f中,只要為1的,在d中相對應的數字在之后運算中都無需再改,因為它就是最短路徑了)
接着,我們就可以從V1經過V4之后的所有路徑進行計算了(在計算過程中,若數據比原數據大,就保留原數據,否則替換原數據)
如圖所示:
步驟三:
在輸入V4的所有數據后,我們再次看d中的數字,在d的數組中,最小的數字為V2對應的6
那么,這次我們把V6對應的數字為結點,在f中對應的0改成1
再通過V6與其他在f中為0,d中相對應的數據進行路徑長短計算(在計算過程中,若數據比原數據大,就保留原數據,否則替換原數據)
如圖所示:
步驟四:
在輸入V4的所有數據后,我們再次看d中的數字,在d的數組中,最小的數字為V5對應的12
那么,這次我們把V5對應的數字為結點,在f中對應的0改成1
再通過V5與其他在f中為0,d中相對應的數據進行路徑長短計算(在計算過程中,若數據比原數據大,就保留原數據,否則替換原數據)
如圖所示:
步驟五:
在輸入V5的所有數據后,我們再次看d中的數字,在d的數組中,最小的數字為V7對應的36
那么,這次我們把V7對應的數字為結點,在f中對應的0改成1
再通過V7與其他在f中為0,d中相對應的數據進行路徑長短計算(在計算過程中,若數據比原數據大,就保留原數據,否則替換原數據)
如圖所示:
步驟六:
在輸入V7的所有數據后,我們再次看d中的數字,在d的數組中,最小的數字為V3對應的49
那么,這次我們把V3對應的數字為結點,在f中對應的0改成1
再通過V3與其他在f中為0,d中相對應的數據進行路徑長短計算(在計算過程中,若數據比原數據大,就保留原數據,否則替換原數據)
如圖所示:
步驟七:
在輸入V3的所有數據后,我們再次看d中的數字,在d的數組中,最小的數字為V6對應的50
那么,這次我們把V6對應的數字為結點,在f中對應的0改成1
再通過V6與其他在f中為0,d中相對應的數據進行路徑長短計算(在計算過程中,若數據比原數據大,就保留原數據,否則替換原數據)
如圖所示:
步驟八:
在輸入V6的所有數據后,我們看到f數組中,只剩下了V8的數據為0,
那么,這次我們只要把V8在f中對應的0改成1,那么這次試題就結束了
如圖所示:
結果:
以V1為開始結點到其他的結點的最短距離分別是:
V1 -> V2 = 6
V1 -> V3 = 49
V1 -> V4 = 1
V1 -> V5 =12
V1 -> V6 = 50
V1 -> V7 = 36
V1 -> V8 = 56
END