1. 程式人生 > >Bellman-Ford(BF)算法

Bellman-Ford(BF)算法

執行 減少 turn nbsp 最短路徑問題 最短路徑 lse true 完全

以下只是本人的筆記,想法我自己都懷疑,內容不作為參考,

Dijkstra算法可以很好的解決無負權圖的最短路徑問題,但是如果出現負值權值就會失效。此時就需要BF算法,BF和dj算法都能解決單源最短路徑問題,但是算法思想是完全不同的,dj是選取到起點路徑最短的點,然後以該點為中心更新相關聯的路徑長,最外層的n次循環保證的是n個點均能被訪問(見上篇博客)

但是BF算法完全不同,最外層的n-1次循環是為了保證成功構建n-1條路徑,其實不一定需要n-1次執行,可以適當剪枝,內層的兩次for循環是遍歷每個點的所有邊中的權值最小的邊(我總覺得不大對)

bool Bellman(int s){
	for(int i=0;i<n-1;i++){
		for(each edge u->v){
			if(d[u]+length[u->v]<d[v]){
				d[v]=d[u]+length[u->];
			}
		}
	}
	for(each dege u->v){
		if(d[u]+length[u->v]<d[v])
		return false;
	}
	return true;
} 

  在使用鄰接矩陣時時間復雜度是v3,但在使用鄰接鏈表時時間復雜度是VE,有一些減少時間復雜度的方法,比如

Bellman-Ford(BF)算法