單源最短路徑之Bellman Ford

2021-07-11 22:46:59 字數 1765 閱讀 8711

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...