Bellman-Ford(BF)算法
阿新 • • 發佈:2019-01-09
執行 減少 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)算法