數據結構(C#):圖的最短路徑問題、(Dijkstra算法)


  今天曾洋老師教了有關於圖的最短路徑問題,現在對例子進行一個自己的理解和整理:

題目:

要求:變成計算出給出結點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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM