Dijkstra最短路徑演算法初探

2021-04-12 14:06:54 字數 2729 閱讀 3179

資料來源:

一組頂點

vi(i=1~n)

,頂點間通路

(vi, vj),

通路的距離

dis(i,j)。目標

: 任意給定一組起點

s, 終點

d, 計算

s==》

d之間的最短距離

, 並給出通路。

演算法輸入資料舉例如下:

4//四個頂點

4//四個通路

1 2 4//頂點1

到頂點2

存在距離為

4的通路

1 3 5//…

2 4 3//…

3 4 1//頂點3

到頂點4

存在距離為

1的通路

1 4//

求頂點1

到頂點4

的最短距離

dijkstra

演算法可能的思路:

1.設s==》

d之間的最短距離為

dis_min(s,d)

,設在s

==》d

之間可以找到

k(k一般為無窮大

)條通路,每條通路距離為

dis_m(s,d) m=1~k

,顯然dis_min(s,d) = min

。如果,

我們選定了一條

s==》

d之間的通路,我們如何確定它就是最短的呢?這個不好論證,因此我們需要換一種方法來論證:擴大

dis_min(s,d)

的比較範圍和論證範圍。2.設

s==》

n個點之間的無窮個路徑的無窮個距離排序後為0~

dis_max

,顯然0是s

==》s

的最短距離,那麼哪乙個是

s==》

d之間的最短距離呢?或者說:哪乙個是

s==》任意點之間的最短距離呢?

3.我們從0~

dis_max

中間挨個選取,首先

0被選出

(因為是

s==》

s的最短距離

),而後

dis_1

被選出(因為是

s到它附近最近乙個點的距離,例如:

s周邊有

j個點與

s直接相連,這樣就有

j個距離,顯然在

j個距離中必然存在乙個最小值

dis_x

,dis_x

不可能被突破,有

dis_1== dis_x

),而後是

dis_2

被選出?似乎難以判斷。但從

dis_1

的選出可以看到一種不完整的選擇規則:我們可以很容易地選出與

s最近的點,但是如何選出與

s第二近的點?

4.想想第二步中

dis_0 = 0

被選出的過程,以及

dis_1

被選出的過程,實際上,找到下乙個點的方法已經出來了:將

dis_1

連線的點(設為

s_1)加入到源點

s集合中,考察與s、

s_1直接連線的所有點,計算它們與

s的距離,選擇最短的路徑對應的點

s_2加入源點集。這樣我們就選出了與

s最近的三個點,繼續查詢下去就會獲得s到

d的最短路徑。

另註:乙個逆向結論:設

s==》

s_1==》

s_2==》

s_3==》

…==》

s_n==》d是

s==》

d的最近路徑,那麼

s==》

s_1==》

s_2==》

s_3==》

…==》

s_n一定是

s==》

s_n的最近路徑,否則就可以用

s==》

s_n的最近路徑來替換

s==》

d的那段路徑,這樣就與假設不符了。但是反過來,由

s==》

s_n是最近路徑推論

s==》

s_n==》

d是最短路徑是不行的,因為可能存在

s==》

s_n==》

s_a==》

d更近。

以上逆向結論對應的順向推導結論只能這樣:找到所有源點集的直接相連點(不能在源點集中找,因為這樣會形成無效環路),計算這些通路的距離,將最短的通路所關聯的點加入到源點集。

資料結構:1.點

2.兩點間聯通路徑及其方向、距離

3.close

表、源點集(源路徑集。每個源點記載到

s點的距離及路徑)

4.open

表、等待比較的路徑集(以路徑長度排序)

演算法:從點集中將

s點移入

close

表。while

(close

表中沒有找到d點)

這個dijkstra

演算法,我看過數遍,但至今仍然覺得我沒有真正理解它的精髓所在。上次得力於一位朋友給我講解了一下基本

dijkstra

演算法及其變化版本,感觸最深的是其優雅的適應演算法的資料結構。資料結構依賴於演算法的確立,演算法依賴於源資料和目標的確立,同時資料結構和演算法兩者又相輔相成。這次花時間用自己的一種方法從特殊的角度描述

dijkstra

演算法,試圖將

dijkstra

演算法敘說的比較觸及根源,但自我感覺還是不夠,或許還是我的數學底子太差,描述問題不夠清晰條理。

Dijkstra最短路徑演算法

基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...

Dijkstra最短路徑演算法

引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...

最短路徑 Dijkstra演算法

最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...