由於bellman-ford演算法在每實施一次鬆弛操作後,就會有一些頂點已經求得其最短路,此後這些頂點的最短路的估計值就一直保持不變,不再受到後續鬆弛操作的影響,但是每次還要判斷是否需要鬆弛,浪費了時間
優化方法:每次僅對最短路估計值發生改變了的頂點的所有出邊進行鬆弛操作
求圖中1號頂點到2、3、4、5號頂點的最短路徑
input
5 71 2 2
1 5 10
2 3 3
2 5 7
3 4 4
4 5 5
5 3 6
第一行:頂點數、邊數
a b c:從a點到b點的權重為c
bellman-ford優化演算法思路:類似於dijktra演算法,只不過bellman-ford是對邊進行鬆弛,而dijktra演算法是對頂點進行操作,不過都是採用廣搜的做法,bellman-ford對佇列隊首元素的所有出邊鬆弛,如果某個頂點已經入隊,那麼就標記就不用再入隊了(相比於dijktra演算法是在所有頂點中尋找與頂點的連線,這種演算法更快一點,但是如果是乙個稠密圖的話也就相差無幾),直到佇列中元素全部出隊
**如下
#include
#include
#include
#include
using namespace std;
int n,m,i,j,k,dis[10]
,u[10
],v[10]
,w[10
],first[10]
,next[10]
,book[10]
;void
bellman_ford()
}//繼續鬆弛與now相連的另乙個出邊
k = next[k];}
}}intmain()
bellman_ford()
;for
(i =
1;i <= n;i++
)printf
("%d "
,dis[i]);
return0;
}
使用bellman-ford佇列演算法判斷負權迴路:如果某個點進入佇列的次數超過n次,那麼這個圖定然存在負權迴路關鍵之處:只有那些在前一遍鬆弛中改變了最短路程的估計值的頂點,才能引起他們鄰接點最短路程估計值的改變。因此,用乙個佇列來存放被成功鬆弛的頂點,之後只對佇列中的點進行處理,這就降低了演算法的時間複雜度 bellman ford演算法的理解
include include include define inf 0x3f3f3f3f using namespace std typedef struct edge edge edge edge 1100 int source,edgenum,nodenum int dist 1100 儲存源...
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...