Aha! Algorithms - Bellman-Ford

《啊哈!算法》第 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容