1.演算法標籤
bfs2.演算法概念
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.**實現
標頭檔案:
filename: bellman_ford.h
*/#ifndef _bellman_ford_
#define _bellman_ford_
#include
"graph.h"
#include
bool bellmanford(graphadjlist *g,int start,vector & previous);
#endif
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;
}
測試檔案:
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...