Bellman Ford演算法實現類

2021-06-05 03:51:50 字數 1079 閱讀 7401

貌似bellman-ford演算法和dijkstra演算法類似,只是多了個處理負權值的考慮。不過bellman-ford演算法比較簡單易懂,雖然複雜度較高,有o(ve

)。 演算法類如下,至於介紹吧,維基(上面蠻詳細的。

三個步驟:

1、陣列distant[i]記錄從源點s到頂點i的路徑長度,初始化陣列distant[n]為無窮大, distant[s]為0;

2、以下操作迴圈執行至多n-1次,n為頂點數:

對於每一條邊e(u, v),如果distant[u] + w(u, v) < distant[v],則另distant[v] = distant[u]+w(u, v)。w(u, v)為邊e(u,v)的權值;

若上述操作沒有對distant進行更新,說明最短路徑已經查詢完畢,或者部分點不可達,跳出迴圈。否則執行下次迴圈;

3、為了檢測圖中是否存在負環路,即權值之和小於0的環路。對於每一條邊e(u, v),如果存在distant[u] + w(u, v) < distant[v]的邊,則圖中存在負環路,即是說改圖無法求出單源最短路徑。否則陣列distant[n]中記錄的就是源點s到各頂點的最短路徑長度。

#include #define pointnum 10

#define noset_positive_int -1

#define inifinite 2147483647

using namespace std;

struct edge

;class graph

;graph::graph()

void graph::initialize()

distance[source] = 0;

}void graph::relaxedges()

} }}bool graph::checknegativecycle()

} return true;

}bool graph::bellmanford()

int main()

cin >> a.source;

if( a.bellmanford() ) }

return 0;

}

Bellman Ford貝爾曼福特演算法實現

作為一種單源最短路徑演算法,bellman ford對於有向圖和無向圖都能適用,它還有乙個 dijkstra演算法無法 具備的特點,那就是對含負權圖的最短路徑搜尋。每i輪對邊的遍歷之後,只要不存在負權迴路,bellman ford演算法都 可以保證獲得距離源點i條邊的點的最短路徑。因為最短路徑的最大...

Bellman Ford演算法,SPFA演算法

bellman ford 演算法能在更普遍的情況下 存在負權邊 解決單源點最短路徑問題。對於給定的帶權 有向或無向 圖g v,e 其源點為 s,加權函式w是 邊集e 的對映。對圖g執行 bellman ford 演算法的結果是乙個布林值,表明圖中是否存在著乙個從源點s 可達的負權迴路。若不存在這樣的...

Bellman ford 演算法詳解

昨天說的dijkstra固然很好用,但是卻解決不了負權邊,想要解決這個問題,就要用到bellman ford.我個人認為bellman ford比dijkstra要好理解一些,還是先上資料 有向圖 5 712 8135 23 6 5 4 324 735 2 45 3 在講述開,先設幾個陣列 orig...