算法系列——弗洛伊德算法(Floyd)

本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节。我在努力!

本篇文章编程语言为Python,供参考。

弗洛伊德算法(Floyd)

典型最短路径算法。用于计算任意两个结点之间的最短路径。

基本原理以某个点作为中介点,更新全部以其作为中介点的两点最短路径,以这种方式遍历全部顶点作为中介点的情况。(即把n个结点分别作为中介点,去逐遍更新邻接矩阵,最终得出任意俩点最短路径距离)

算法系列——弗洛伊德算法(Floyd)_第1张图片

 

1. 邻接矩阵构建

基本用途:用一个二维数组存放两两结点之间的距离或权值。

算法系列——弗洛伊德算法(Floyd)_第2张图片

 算法系列——弗洛伊德算法(Floyd)_第3张图片

 2. 算法实现

算法系列——弗洛伊德算法(Floyd)_第4张图片

 算法流程还是非常简单的,一看就懂,三重循环,逐个枚举即可。比较复杂的是它究竟为什么这么做就可以。

3. 最短路径的寻找

算法系列——弗洛伊德算法(Floyd)_第5张图片

附全部源码:

#北京 天津 郑州 济南 长沙 海南
# 0    1    2    3    4    5

#模拟从文件中读入图的各个路径
a = """
0 1 500
0 2 100
1 2 900
1 3 300
2 3 400
2 4 500
3 4 1300
3 5 1400
4 5 1500
"""

INF = float('inf')

#定义邻接矩阵 记录各城市之间的距离
weight = [[INF if j!=i else 0 for j in range(6)] for i in range(6)]

#解析数据
b = [[int(i) for i in i.split(' ')] for i in a.split('\n') if i != '']

for i in b:
    weight[i[0]][i[1]] = i[2]
    weight[i[1]][i[0]] = i[2]

def floyd(src, target):
    path = [[j for j in range(6)] for i in range(6)]

    for k in range(6):
        for j in range(6):
            for i in range(6):
                if weight[i][k] + weight[k][j] < weight[i][j]:
                    weight[i][j] = weight[i][k] + weight[k][j]
                    #记录经过的点
                    path[i][j] = path[i][k]

    #输出最短路径的各个节点
    i = src
    while i != target:
        print(i, end="->")
        i = path[i][target]
    print(target)

    return weight[src][target]

testi = 1
testj = 4

floyd(testi, testj)


后记:用了四个小时,学习和思考Floyd算法,问了自己无数个为什么,最后,只想说一句,大佬牛逼。(太烧脑了,头疼ing...)

你可能感兴趣的:(python,算法)