📜  DAA | Floyd-Warshall算法(1)

📅  最后修改于: 2023-12-03 15:30:21.435000             🧑  作者: Mango

DAA | Floyd-Warshall算法

Floyd-Warshall算法是一种用于求解所有源点之间最短路径的动态规划算法。它可以处理负边权图,但是不能处理带有负环的图。

算法原理

该算法使用一个二维数组D[i][j]来保存从i到j的最短路径长度(初始为i到j的边权),再使用三重循环遍历所有节点k(k代表中转节点),更新D[i][j],即

D[i][j] = min(D[i][j], D[i][k]+D[k][j])

这个式子的含义是,如果从i到k再到j的路径长度比从i直接到j的路径长度短,那么从i到j的最短路径就是从i到k再到j的路径。

代码实现

以下是Floyd-Warshall算法的Python3实现:

INF = float('inf')

def floydWarshall(graph):
    n = len(graph)
    dist = [[graph[i][j] for j in range(n)] for i in range(n)]
    
    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])
                
    return dist

上述代码中,graph代表原始的邻接矩阵,dist代表最短路径矩阵,INF代表正无穷(即两个节点之间不存在路径时取的值)。

时间复杂度

Floyd-Warshall算法的时间复杂度为O(n^3),其中n为图中节点数量。因此,该算法对于大规模图的运算效率较低,但在节点数量较少的情况下仍然表现良好。

总结

Floyd-Warshall算法是一种基于动态规划的最短路径算法,可以处理带有负边权的图。由于其时间复杂度较高,仅适用于节点数量较少的情况下。