內容會持續更新,有錯誤的地方歡迎指正,謝謝!
以 s 為源節點,實現bellman-ford(中文名:貝爾曼福特演算法) 單源最短路徑演算法。
dijkstra演算法
請見下方**:
但dijkstra演算法不適用於有負權邊的圖,所以這裡,用bellman-ford 演算法。
bellman-ford 演算法
單源最短路徑(2):bellman-ford 演算法
單源最短路徑(4):總結
實現floyd_warshall(中文名:佛洛依德演算法) 全成對最短路徑演算法
求最短路的floyd演算法框架:
宣告乙個二維陣列(官方叫:鄰接矩陣),用於將有向圖轉化為這個二維陣列matrix,如何轉化?
1. 先將對角線上的元素置0,非對角線上元素置無窮大;
2. 再將圖中互相相連的兩點的距離寫入到二維陣列中;比如下圖點1到點2的距離為3,則matrix[0][1] = 3;
3. floyd登場:見下方floyd分析板塊
floyd分析:
整個演算法雖然感覺很麻煩,但其實**實現卻非常簡單,核心**只有五行:
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>
e[i][k]+e[k][j])//k為中轉點,e[i][k]表示從i到k的路徑長度
e[i][j]=e[i][k]+e[k][j];
這五行**的基本思想:傳遞思想,或叫中轉思想。最開始k=1,只允許經過1號頂點(必須經過1號頂點)進行中轉;接下來k=2,允許經過1和2號頂點(必須經過2號頂點)進行中轉……最後k=n,允許經過1~n號所有頂點(必須經過n號頂點)進行中轉,便可求得任意兩點之間的最短路程,至於經不經過除k號頂點以外的頂點,要根據實際輸入和每條路徑的最短長度的計算結果而定。
用一句話概括就是:求 從i號頂點到j號頂點只經過「前k號點」的最短路程。
其實這是一種動態規劃的思想——1.最優化問題;2.把大問題轉化為一系列互相有關係的子問題,子問題的求解依賴於其它子問題的解。動態規劃總結:就是根據每步計算的結果一步步地構造出了最優解決方案。
所以,就有遞推式:
基於迭代的**:
#include using namespace std;
intmatrix[6][6];
void floyd_warshall(int n) }}
}int main()
}getchar();
return
0;}
單源最短路徑
include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...
單源最短路徑
最優子結構 最短路徑的子路徑也是最短路徑,動態規劃和貪心演算法的乙個重要指標。環路 一條最短路徑不可能包含環路 1 環路權重為負,如果有一條環路權重為負,則不存在最短路徑 2 環路權重為零,如果包含該環路,則將該環路去掉即可 3 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...
單源最短路徑
單源最短路徑問題,即在圖中求出給定頂點到其他任一頂點的最短路徑。1.最短路徑的最優子結構性質 該性質描述為 如果p i,j 是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p k,s 必定是從k到s的最短路徑。證明 假設p i,j 是從頂點i到j的最短路徑,則有p i,j p i,k...