Python中使用Floyd算法求全源最短路径

2023-04-11 00:00:00 算法 最短 求全

Floyd算法是求解全源最短路径的一种经典算法,可以处理带负权边的图,时间复杂度为O(n^3),其中n为顶点数。下面是Python中使用Floyd算法求全源最短路径的示例代码:

INF = float('inf') # 无穷大

def floyd(graph):
    n = len(graph)
    dist = [[INF] * n for _ in range(n)] # 初始化距离矩阵
    for i in range(n):
        dist[i][i] = 0 # 自身到自身距离为0
        for j in range(n):
            if graph[i][j] != 0:
                dist[i][j] = graph[i][j] # 相邻节点之间的距离

    for k in range(n):
        for i in range(n):
            for j in range(n):
                if dist[i][j] > dist[i][k] + dist[k][j]:
                    dist[i][j] = dist[i][k] + dist[k][j] # 更新最短路径

    return dist

# 示例
graph = [[0, 3, 8, INF, -4],
         [INF, 0, INF, 1, 7],
         [INF, 4, 0, INF, INF],
         [2, INF, -5, 0, INF],
         [INF, INF, INF, 6, 0]]
dist = floyd(graph)

# 打印最短距离矩阵
for i in range(len(dist)):
    for j in range(len(dist[i])):
        if dist[i][j] == INF:
            print("INF", end="\t")
        else:
            print(dist[i][j], end="\t")
    print()

在以上代码中,首先定义了一个表示无穷大的常量INF,然后定义了函数floyd来计算全源最短路径。该算法使用了一个n×n的距离矩阵dist来存储任意两个节点之间的距离,首先对距离矩阵进行初始化,将相邻节点之间的距离存入矩阵中。接着使用三重循环对距离矩阵进行更新,使得任意两个节点之间的距离表示最短路径。最后返回更新后的距离矩阵。

以上代码可以用于处理任意大小的带权有向图,不论是采用邻接矩阵或邻接表来实现的。

相关文章