算法 - 图论09(Swift版本)

4 阅读1分钟

题目1: dijkstra(堆优化版)精讲

讲解

使用小顶堆,对边权值进行自动排序。

题目2: Bellman_ford 算法精讲

讲解

单源最短路问题, 考虑边有负权值的情况。
对所有边进行松弛 n - 1次。

func bellmanFord(n: Int, e: Int, grid: [[Int]]) {
    var minDist = Array(repeating: Int.max, count: n + 1)
    minDist[1] = 0
    // n - 1次松弛
    for _ in 1..<n {
        for line in grid {
            let from = line[0]
            let to = line[1]
            let val = line[2]
            if minDist[from] != Int.max {
                minDist[to] = min(minDist[to], minDist[from] + val)
            }
        }
        print("\( minDist.map { String($0) }.joined(separator: " ") )")
    }
    if minDist[n] == Int.max {
        print("unconnected")
    } else {
        print("\(minDist[n])")
    }

}

// bellmanFord(n: 6, e: 5, grid: [[5, 6, 1], [4, 5, 1], [3, 4, 1], [2, 3, 1], [1, 2, 1]]) // 5
// bellmanFord(n: 6, e: 7, grid: [[5, 6, -2], [1, 2, 1], [5, 3, 1], [2, 5, 2], [2, 4, -3], [4, 6, 4], [1, 3, 5]]) // 1
bellmanFord(n: 4, e: 2, grid: [[1, 2, -1], [3, 4, -1]]) // unconnected