資料來源:
一組頂點
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...