單源最短路徑的Bellman Ford 演算法

2022-04-10 07:18:54 字數 1526 閱讀 3013

1.演算法標籤

bfs

2.演算法概念

bellman-ford演算法有這麼乙個先驗知識在裡面,那就是最短路徑至多在n步之內,其中n為節點數,否則說明圖中有負權值的迴路,這樣的圖是找不到最短路徑的。因此bellman-ford演算法的思想如下,進行n次迴圈,在第 k 次迴圈中用dist陣列記錄 k 步之內到達各個頂點的最短路徑長度,記做distk,然後在第k+1次迴圈中,遍歷每條邊,若有dist[v]>dist[u]+cost[u][v],則更新distk+1[v]=dist[u]+cost[u][v],並將v節點的前驅節點記為u。因此這是乙個廣度優先的演算法,如果n次迴圈之後發現還未收斂,說明有負權值的迴路,說明找不到最短路徑。正因為如此,bellman-ford演算法適應性比較強,但是演算法複雜度較高,為o(ve),不過,經過優化的bellman-ford演算法效率能有明顯的提公升。

bellman-ford演算法維持一下幾個資料結構:

3.**實現

標頭檔案:

[email protected]

filename: bellman_ford.h

*/#ifndef _bellman_ford_

#define _bellman_ford_

#include

"graph.h"

#include

bool bellmanford(graphadjlist *g,int start,vector & previous);

#endif

[email protected]

filename : bellman_ford.cpp

*/#include

"bellman_ford.h"

using

namespace std;

bool bellmanford(graphadjlist *g,int start,vector & previous)

cur=cur->next;}}

}for(int j=0;jnumnodes;++j)

}return true;

}

測試檔案:

[email protected]

filename : testbellmanford.cpp

*/#include

"bellman_ford.h"

#include

"graph.h"

using

namespace std;

int main()

else cout<

}

示例輸入(同dijkstra一節中的例子):

示例輸出:

單源最短路徑

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...