《啊哈!算法》第 6 章第 3 節,Bellman-Ford 算法求最短路徑的 Swift 實現。
問題
已知 5 個頂點和 5 條邊,求 0 點到其他頂點的最短路徑。
解決
通過 n-1 次遍歷所有邊,找出中轉至目標頂點的最短路徑。
//從頂點 u[i] 到 v[i] 的權值是 w[i]
let u = [1, 0, 0, 3, 2]
let v = [2, 1, 4, 4, 3]
let w = [2, -3, 5, 2, 3]
let n = 5 //頂點數量
let m = 5 //邊的數量
var inf = 99999999
//初始化 dis,表示 0 點到其他頂點的距離
var dis = [inf, inf, inf, inf, inf]
//自己到自己距離為 0
dis[0] = 0
//標記 dis 是否發生改變
var check = 0
//進行 n-1 輪“松弛”
for k in 0..<n-1 {
check = 0
for i in 0..<m { //枚舉每一條邊
//嘗試對每一條邊松弛
//源點到 v[i] 的距離與中轉到達的權值比較大小
//從 u[i] 到 v[i],也就是權值 w[i]
//源點先到 u[i] 然后再到 v[i] = dis[u[i]] + w[i]
if dis[v[i]] > dis[u[i]] + w[i] {
dis[v[i]] = dis[u[i]] + w[i]
check = 1 //數組 dis 發生變化
}
}
//dis沒變化則跳出循環
if check == 0 {
break
}
}
//輸出結果
for item in dis {
print("\(item)", separator: "", terminator: " ")
}
美國應用數學家 Richard Bellman 于 1958 年發表了該算法。Lester Ford, Jr. 在 1956 年也發表了該算法。此外 Edward F. Moore 在 1957 年也發表了同樣的算法。
代碼在 GitHub