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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • [编程题]比较重量小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们...
    骇客与画家阅读 867评论 0 0
  • 最短路径算法在现实生活中也具有非常多的应用,例如在一个复杂的景区,想要从一个景点到另外一个景点,利用最短路径算法就...
    郑明明阅读 1,862评论 0 6
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,789评论 0 33
  • Floyd 算法 简介 Floyd 算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径...
    廖少少阅读 8,690评论 0 1
  • 很多同学都有跑步、健身或者乘坐交通工具时,听音乐的习惯,也有浏览网页文章时先收藏后阅读的习惯。作为重度的时间管理强...
    知行日程阅读 20,421评论 0 3