單源最短路徑(single-source shortest path )

Britjeans發表於2018-06-11

《演算法導論》單源最短路徑筆記

問題描述:給定一個圖G=(V,E),我們希望找到從給定源結點到每個結點v的最短路徑

解決思路:兩個結點之間的一條最短路徑包含著其他的最短路徑。

注:最短路徑不能包含權重為負值的環路。當圖中不含負權重邊的時候我們可以使用Dijkstra演算法來找到所有從源結點出發最短的路徑。當圖中含有負權重邊的時候我們使用效率低一些的Bellman-Ford演算法,在找尋最短路徑的同時不斷判斷圖中是否包含負權重環路。

1. 鬆弛操作(Relaxation)

我們將結點v的前驅記作v.pi,v到源點的最短距離為v.d。我們首先將d初始化為無窮大,pi初始化為NULL。


然後我們便可以使用任意一種尋找最短路徑的演算法來遍歷圖中的點並更新點到源點的最短路徑了。

其中更新最短路徑的操作也叫做放鬆(relax),虛擬碼如下:


2. Bellman-Ford

Bellman-Ford演算法解決的是一般情況下的單源最短路徑問題。通過對邊進行鬆弛操作來漸進地降低從源結點s到每個結點v的最短路徑,直到該估計值與實際的最短路徑權重相同時為止。演算法時間複雜度為O(VE)。


2. Dijkstra

Dijkstra演算法利用了貪心策略


4. 差分約束和最短路徑(Difference constraints and shortest paths)

線性規劃中的一個特例可以被簡化成單源最短路徑問題。

常見線性規劃問題的描述:

給定一個mXn的矩陣A、一個m維的向量b和一個n維的向量c。我們希望找到一個n維向量x,使得在由Ax<=b給定的m個約束條件下優化目標函式

有時候,我們並不要求得到最優解,只需要找到一個可行解。

舉個例子來說明:


上面的不等式便是一個線性規劃問題的約束條件,我們可以將其轉換成一個約束圖。我們將上面的mXn的矩陣A看作是一張由n個結點和m條邊構成的圖的領結矩陣的轉置。對於i=1,2···,n,圖中的每個結點vi對應n個未知變數xi中的一個。圖中的每條有向邊則對應m個不等式中的一個。


可以通過在對應的約束圖中尋找最短路徑來找到一個差分約束系統的解,證明見演算法導論24章。

定理 給定差分約束系統Ax<=b,設G=(V,E)是該差分約束系統所對應的約束圖。如果圖G不包含權重為負值的環路,則


是系統的一個可行解。如果圖G包含權重為負值的環路,則該系統沒有可行解。



相關文章