bellman-ford的使用範圍
1、單源
2、有負權重
3、有向
bellman-ford演算法的描述
最短路徑估計值g(v):當前求得的源節點s到節點v最短距離
最短路徑d(v):源節點s帶節點v的最短路徑距離
bellman-ford演算法通過對所有的邊進行鬆弛操作來漸漸地降低從源節點s到每個節點v的最短路徑估計值g(v),直到g(v)=d(v)。
bellman-ford演算法的模板
class edge//表示邊,u為邊的起點,v為邊的終點,w為邊的權重
int n;//節點的總個數
int m;//邊的總條數
int s;//源節點
edge e;//e[i]:第i條邊
int d;//d[i]:s到i的最短路徑長度
boolean bellman_ford()
}if(!flag)//若flag為false說明本次沒有對任何一條邊進行鬆弛,那麼以後的每一次都不會對任何一條邊進行鬆弛,所以剩下的鬆弛操作也沒必要了
}//**//
//***//判斷是否有負環
for(int i=0;id[u]+w)
}return true;//沒有負環
//***//
}
收斂性質:
對於某些節點u,v,如果s~u~v是一條最短路徑,並且在對邊(u,v)進行鬆弛前的任意時間有g[u]=d[u],則在之後的所有時間有g[v]=d[v]。
證明bellman-ford的正確性
1、證明若不存在負環,則對所有邊進行n-1次鬆弛之後,對於所有從s可以到達的節點v,有g[v]=d[v]
證明:設p=(s,v1,v2,...,vk)為從源節點到vk之間的任意一條最短路徑。根據收斂性質,在進行第一次鬆弛後,g[v1]=d[v1],在進行第二次鬆弛後,g[v2]=d[v2],。。。,在進行第k次鬆弛後,g[vk]=d[vk]。由於p最多包含n-1條邊,所以經過n-1次鬆弛後,對於所有從s可以到達的節點v,有g[v]=d[v]。
2、證明對所有邊進行n-1次鬆弛之後,若有某條邊(u,v),使得g(v)>g(u)+w(u,v),則存在負環
證明:我們可以斷言:若沒有負環,則對於任意一條邊(u,v),有g(v)<=g(u)+w(u,v)。由於該命題成立,則該命題的逆否命題也成立。
所以可以推出:若有某條邊使得g(v)>g(u)+w(u,v),則存在負環。得證
3、證明對所有邊進行n-1次鬆弛之後,若對任意的邊(u,v),都有g(v)<=g(u)+w(u,v),則不存在負環
證明:假設存在負環,設該環路為c=(v0,v1,v2,...,vk),v0=vk。
由於c未負環,所以有w(v0,v1)+w(v1,v2)+...+w(vk-1,vk)<0。
由於對於所有的邊都有g(v)<=g(u)+w(u,v),
所以有g(vi)<=g(vi-1)+w(vi-1,vi),i=1,2,...,k,
將k個等式加起來,有g(v1)+g(v2)+...+g(vk)<=g(v0)+g(v1)+...+g(vk-1)+w(v0,v1)+w(v1,v2)+...+w(vk-1,vk),
由於v0=vk,
所以有g(v0)=g(vk)
所以有w(v0,v1)+w(v1,v2)+...+w(vk-1,vk)>=0.
這與w(v0,v1)+w(v1,v2)+...+w(vk-1,vk)<0相矛盾。所以命題正確
單源最短路徑
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...