最短路徑 Dijkstra

2021-08-24 18:29:03 字數 2906 閱讀 8400

帶權圖的最短路徑問題

1、帶權圖的最短路徑問題

帶權圖的最短路徑問題即求兩個頂點間長度最短的路徑。

其中:路徑長度不是指路徑上邊數的總和,而是指路徑上各邊的權值總和。

路徑長度的的具體含義取決於邊上權值所代表的意義。

【例】交通網路中常常提出的如下問題就是帶權圖中求最短路徑的問題。

(1)兩地之間是否有路相通?

(2)在有多條通路的情況下,哪一條最短?

其中:交通網路可以用帶權圖表示:圖中頂點表示城鎮,邊表示兩個城鎮之間的道路,邊上的權值可表示兩城鎮間的距離,交通費用或途中所需的時間等等。

2、交通網路的表示

由於交通網路存在有向性,所以一般以有向網路表示交通網路。

【例】設a城到b城有一條公路,a城的海拔高於b城。若考慮到上坡和下坡的車速不同,則邊和邊上表示行駛時 間的權值也不同。即和應該是兩條不同的邊。

3、源點和終點

習慣上稱路徑的開始頂點為源點(source),路徑的最後乙個頂點為終點(destination)。

為了討論方便,設頂點集v=,並假定所有邊上的權值均是表示長度的非負實數。

單源最短路徑問題

(single-source shortest-pathsproblem)

單源最短路徑問題:已知有向帶權圖(簡稱有向網)g=(v,e),找出從某個源點s∈v到v中其餘各頂點的最短路徑。

1、邊上權值相等的有向網的單源最短路徑

用求指定源點的bfs生成樹的演算法可解決

2、迪傑斯特拉(dijkstra)演算法求單源最短路徑

由dijkstra提出的一種按路徑長度遞增序產生各頂點最短路徑的演算法。

(1)按路徑長度遞增序產生各頂點最短路徑

若按長度遞增的次序生成從源點s到其它頂點的最短路徑,則當前正在生成的最短路徑上除終點以外,其餘頂點的最短路徑均已生成(將源點的最短路徑看作是已生成的源點到其自身的長度為0的路徑)。

【例】在有向網g8中,假定以頂點0為源點,則它則其餘各頂點的最短路徑按路徑遞增序排列如右表所示

(2)演算法基本思想

設s為最短距離已確定的頂點集(看作紅點集),v-s是最短距離尚未確定的頂點集(看作藍點集)。

①初始化

初始化時,只有源點s的最短距離是已知的(sd(s)=0),故紅點集s=,藍點集為空。

②重複以下工作,按路徑長度遞增次序產生各頂點最短路徑

在當前藍點集中選擇乙個最短距離最小的藍點來擴充紅點集,以保證演算法按路徑長度遞增的次序產生各頂點的最短路徑。

當藍點集中僅剩下最短距離為∞的藍點,或者所有藍點已擴充到紅點集時,s到所有頂點的最短路徑就求出來了。

注意:①若從源點到藍點的路徑不存在,則可假設該藍點的最短路徑是一條長度為無窮大的虛擬路徑。

②從源點s到終點v的最短路徑簡稱為v的最短路徑;s到v的最短路徑長度簡稱為v的最短距離,並記為sd(v)。

(3)在藍點集中選擇乙個最短距離最小的藍點k來擴充紅點集

根據按長度遞增序產生最短路徑的思想,當前最短距離最小的藍點k的最短路徑是:

源點,紅點1,紅點2,…,紅點n,藍點k

距離為:源點到紅點n最短距離+《紅點n,藍點k>邊長

為求解方便,設定乙個向量d[0..n-1],對於每個藍點v∈ v-s,用d[v]記錄從源點s到達v且除v外中間不經過任何藍點(若有中間點,則必為紅點)的"最短"路徑長度(簡稱估計距離)。

若k是藍點集中估計距離最小的頂點,則k的估計距離就是最短距離,即若d[k]=min,則d[k]=sd(k)。

初始時,每個藍點v的d[c]值應為權w,且從s到v的路徑上沒有中間點,因為該路徑僅含一條邊。

注意:在藍點集中選擇乙個最短距離最小的藍點k來擴充紅點集是dijkstra演算法的關鍵

(4)k擴充紅點集s後,藍點集估計距離的修改

將k擴充到紅點後,剩餘藍點集的估計距離可能由於增加了新紅點k而減小,此時必須調整相應藍點的估計距離。

對於任意的藍點j,若k由藍變紅後使d[j]變小,則必定是由於存在一條從s到j且包含新紅點k的更短路徑:p=。且 d[j]減小的新路徑p只可能是由於路徑和邊組成。

所以,當length(p)=d[k]+w小於d[j]時,應該用p的長度來修改d[j]的值。

(5)dijkstra演算法

(6)儲存最短路徑的dijkstra演算法

設定記錄頂點雙親的向量p[0..n-1]儲存最短路徑:

當頂點i無雙親時,令p[i]=-1。

當演算法結束時,可從任一p[i]反覆上溯至根(源點)求得頂點i的最短路徑,只不過路徑方向正好與從s到i的路徑相反。

具體的求精演算法【參見教材】 。

dijkstra演算法的時間複雜度為o(n2 )

其他最短路徑問題

最短路徑問題的提法很多,其它的最短路徑問題均可用單源最短路徑演算法予以解決:

單目標最短路徑問題(single-destination shortest-paths problem):找出圖中每一頂點v到某指定頂點u的最短路徑。只需將圖中每條邊反向,就可將這一問題變為單源最短路徑問題,單目標u變為單源點u。

單頂點對間最短路徑問題(single-pair shortest-path problem):對於某對頂點u和v,找出從u到v的一條最短路徑。顯然,若解決了以u為源點的單源最短路徑問題,則上述問題亦迎刃而解。而且從數量級來說,兩問題的時間複雜度相同。

所有頂點對間最短路徑問題(all-pairs shortest-paths problem):對圖中每對頂點u和v,找出u到v的最短路徑問題。這一問題可用每個頂點作為源點呼叫一次單源最短路徑問題演算法予以解決。

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路徑 Dijkstra

首先,提出兩點 一 如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖 二 如果把無向圖中的每一條邊 vi,vj 都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...