Swift最短路徑之Floyd-Warshall算法

Floyd-Warshall算法,簡稱Floyd算法,用于求解任意兩點間的最短距離。如下圖,表示一個用鄰接矩陣表示的圖,如何求任意兩點之間的距離呢?


floyd.png
  • 當任意兩點之間不允許經過第三個點時,這些點之間的最短距離就是初始距離。

  • 第一步:只允許經過0號頂點,求任意兩點之間的最短路程。這時候只需要判斷map[i][0] + map[0][j] 是否比map[i][j]要小即可。map[i][j]表示從i號頂點到j號頂點之間的路程,map[i][0] + map[0][j]表示的是從i號頂點先到0號頂點,再從0號頂點到j號頂點的路程之和。代碼如下:
    <pre>
    //經過0號頂點
    for i in 0..<map.count {
    for j in 0..<map.count {
    if map[i][j] > (map[i][0] + map[0][j]) {
    map[i][j] = (map[i][0] + map[0][j])
    }
    }
    }
    </pre>

  • 第二部:在第一步的基礎上,只允許經過1號頂點
    <pre>
    //經過1號頂點
    for i in 0..<map.count {
    for j in 0..<map.count {
    if map[i][j] > (map[i][1] + map[1][j]) {
    map[i][j] = (map[i][1] + map[1][j])
    }
    }
    }
    </pre>

  • 以此類推,最后允許通過所有的頂點作為中轉,就能得出任意兩點之間的最短路程。Floyd-Warshall算法的核心代碼只有以下五行!
    <pre>
    for k in 0..<map.count {
    for i in 0..<map.count {
    for j in 0..<map.count {
    if map[i][j] > (map[i][k] + map[k][j]) {
    map[i][j] = (map[i][k] + map[k][j])
    }
    }
    }
    }
    </pre>

  • 完整代碼如下:

<pre>
let max:Int = 10000 //用來表示最大值∞,表示兩個頂點之間無邊
var map = [[0, 2, 6, 4],
[max, 0, 3, max],
[7, max, 0, 1],
[5, max, 12, 0]]

func floyd(map: inout [Array<Int>]) {
for k in 0..<map.count {
for i in 0..<map.count {
for j in 0..<map.count {
if map[i][j] > (map[i][k] + map[k][j]) {
map[i][j] = (map[i][k] + map[k][j])
}
}
}
}
}
floyd(map: &map)
print(map) //[[0, 2, 5, 4], [9, 0, 3, 4], [6, 8, 0, 1], [5, 7, 10, 0]]
</pre>

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

推薦閱讀更多精彩內容

  • [編程題]比較重量小明陪小紅去看鉆石,他們從一堆鉆石中隨機抽取兩顆并比較她們的重量。這些鉆石的重量各不相同。在他們...
    駭客與畫家閱讀 848評論 0 0
  • 最短路徑算法在現實生活中也具有非常多的應用,例如在一個復雜的景區,想要從一個景點到另外一個景點,利用最短路徑算法就...
    鄭明明閱讀 1,855評論 0 6
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • Floyd 算法 簡介 Floyd 算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑...
    廖少少閱讀 8,669評論 0 1
  • 很多同學都有跑步、健身或者乘坐交通工具時,聽音樂的習慣,也有瀏覽網頁文章時先收藏后閱讀的習慣。作為重度的時間管理強...
    知行日程閱讀 20,255評論 0 3