1. 程式人生 > >18.12.30 【sssx】Bellman-Ford演算法

18.12.30 【sssx】Bellman-Ford演算法

適用

含負權邊的有向圖的單源最短路徑問題

不能處理帶負權邊的無向圖和包含權值總和為負值的迴路

 

資料結構

 dist[u] :源點到u的最短路徑長度

 

思路

每次更新dist陣列,使得 dist[u] 的含義是從源點到u的經過n條邊的最短路徑長度

 

遞推公式

$Dist^k[u]=min(dist^{k-1}[u],min{dist^{k-1}[j]+Edge[j][u]}),j=0,1,,n-1,j\ne u$

 

負權迴路的判斷

在求出$dist^{n-1}[]$後,對每條邊$<u,k>$

判斷一下加入這條邊會不會使得頂點k的最短路徑值再縮短,即判斷$dist[u]+w(u,k)<dist[k]$是否成立。

程式碼

 1 int Bellman_ford(int v)  {
 2     for( int i = 1; i <= N; ++i)
 3         dist[i] = INF;
 4     dist[v] = 0;
 5     for( int k = 1; k < N; ++k) { //經過不超過k條邊
 6         for( int i = 0;i < edges.size(); ++i) {
 7             int
s = edges[i].s; 8 int e = edges[i].e; 9 if( dist[s] + edges[i].w < dist[e]) 10 dist[e] = dist[s] + edges[i].w; 11 } 12 } 13 for( int i = 0;i < edges.size(); ++ i) { 14 int s = edges[i].s; 15 int e = edges[i].e;
16 if( dist[s] + edges[i].w < dist[e]) 17 return true; 18 } 19 return false; 20 }