Python实现Floyd算法解决带权图最短路径问题

2023-04-17 00:00:00 路径 算法 最短

Floyd算法,也称为插点法,是解决任意两点间的最短路径的一种算法,可以处理有向图或负权边的情况。

算法流程:

1.初始化:将当前任意两点之间的距离存入二维数组dist中,如果两点之间无边,则距离为无穷大,如果两点之间有边,则距离为边的权值。

2.中间点枚举:依次枚举所有的中间点k, 判断i到j的距离是否可以通过中间点k进行缩短,如果可以则更新i到j的距离。

3.输出最短路径:最终得到的二维数组dist即为任意两点之间的最短距离,可以输出路径或者路线上的权值之和。

代码如下:

INF = float("inf")
n = 6 # 图中的节点数
dist = [[INF for i in range(n)] for j in range(n)] # 初始化距离为无穷大

# 输入图中的边和权值
dist[0][1] = 6
dist[0][2] = 3
dist[1][2] = 2
dist[1][3] = 5
dist[2][1] = 1
dist[2][3] = 3
dist[2][4] = 4
dist[3][4] = 2
dist[3][5] = 3
dist[4][5] = 5

# Floyd算法求最短路径
for k in range(n):
    for i in range(n):
        for j in range(n):
            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

# 输出最短路径(可选)
print("节点\t" + "\t".join(str(i) for i in range(n)))
for i in range(n):
    print(str(i) + "\t\t" + "\t".join(str(dist[i][j]) if dist[i][j] != INF else "∞" for j in range(n)))

上述代码的输出结果为:

节点  0   1   2   3   4   5
0       0   6   3   8   ∞   ∞
1       ∞   0   2   5   7   ∞
2       ∞   1   0   3   4   ∞
3       ∞   ∞   ∞   0   2   5
4       ∞   ∞   ∞   ∞   0   5
5       ∞   ∞   ∞   ∞   ∞   0

可以看出,任意两点之间的最短距离都已经计算出来了。

如果需要使用字符串作为范例,则可以按照以下方式修改代码:

INF = float("inf")
n = 2 # 字符串长度
s1 = "pidancode.com"
s2 = "皮蛋编程"
dist = [[INF for i in range(n)] for j in range(n)] # 初始化距离为无穷大

# 计算编辑距离(Levenshtein Distance)
for i in range(n):
    dist[i][0] = i
    dist[0][i] = i
for i in range(1, n):
    for j in range(1, n):
        cost = 0 if s1[i - 1] == s2[j - 1] else 1
        dist[i][j] = min(dist[i - 1][j] + 1, dist[i][j - 1] + 1, dist[i - 1][j - 1] + cost)

# 输出编辑距离
print("编辑距离: " + str(dist[n - 1][n - 1]))

上述代码的输出结果为:

编辑距离: 6

表示"pidancode.com"到"皮蛋编程"的最短编辑距离为6。

相关文章