單源最短路徑(single-source shortest path )
《演算法導論》單源最短路徑筆記
問題描述:給定一個圖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包含權重為負值的環路,則該系統沒有可行解。
相關文章
- 單源最短路徑
- 單源最短路徑:最短路徑性質的證明
- 單源最短路徑-Dijkstra演算法演算法
- 0016:單源最短路徑(dijkstra演算法)演算法
- 所有結點對的最短路徑問題(All-Paris Shortest Paths)
- P4779 【模板】單源最短路徑(標準版)
- [ABC362D] Shortest Path 3
- QOJ #8232. Yet Another Shortest Path Query
- 單源最短路問題
- BFS求無權圖的單源最短路徑-鄰接矩陣儲存矩陣
- 6.4.2最短路徑
- 圖 - 最短路徑
- HDU4725 The Shortest Path in Nya Graph【Dijkstra+思維】
- 多源最短路徑演算法:Floyd演算法演算法
- HDU - 3790 (雙標準限制最短路徑)最短路徑問題
- 最短路徑問題
- 最短路:求最長最短路
- 最短路 || 最長路 || 次短路
- [ABC232G] Modulo Shortest Path (最佳化建圖)
- 多源最短路徑,一文搞懂Floyd演算法演算法
- SVG <path> 路徑元素SVG
- 題解:AT_abc362_d [ABC362D] Shortest Path 3
- QOJ #8673. 最短路徑
- 最短路徑演算法演算法
- 最短路徑(dijkstra 與 Floyd)
- 迷宮的最短路徑
- 矩陣求最短路徑矩陣
- Path路徑的寫法
- 1046 Shortest Distance(簡單模擬)
- linux中環境便令PATH+路徑 和 路徑 + PATH的區別Linux
- 圖的最短路徑(Dijkstra | Floyd)
- 最短路徑(Floyd演算法)演算法
- 最短路徑(Dijskra演算法)JS演算法
- Djikstra最短路徑演算法演算法
- bellman-ford 單源最短路問題 圖解圖解
- 2024_4_22 路徑花費為最長$k$條邊之和最短路
- cookie path路徑與domain域CookieAI
- [MATLAB]最短路徑Floyd演算法Matlab演算法