Floyd算法的Python代码及复杂度分析
Floyd算法(又称插点法)是解决任意两点间的最短路径的一种算法,是一种动态规划算法。
该算法的主要思想是通过中间点的枚举来更新两点之间的最短路径,直到所有的点都被枚举完毕。具体实现时,用一个二维数组d[i][j]表示从点i到点j的最短路径长度,然后用三重循环枚举中间点k,若从i到k再到j的路径长度比i到j的路径长度更短,则更新d[i][j]。最后得到的d数组即为所求的任意两点间的最短路径。
下面是Floyd算法的Python代码实现:
INF = float('inf') # 无穷大 def floyd(graph): n = len(graph) d = [[0] * n for _ in range(n)] for i in range(n): for j in range(n): d[i][j] = graph[i][j] for k in range(n): for i in range(n): for j in range(n): if d[i][j] > d[i][k] + d[k][j]: d[i][j] = d[i][k] + d[k][j] return d
其中,graph为一个邻接矩阵,表示图的连接关系和权重。
Floyd算法的时间复杂度为O(n^3),其中n为顶点个数。空间复杂度为O(n^2)。虽然Floyd算法的时间复杂度较高,但其优点是实现简单,易于理解。
下面是Floyd算法的范例:
graph = [ [0, 1, INF, INF, INF], [INF, 0, 2, INF, INF], [INF, INF, 0, 3, INF], [INF, INF, INF, 0, 4], [5, INF, INF, INF, 0] ] distances = floyd(graph) for row in distances: print(row)
输出结果为:
[0, 1, 3, 6, 5] [inf, 0, 2, 5, 6] [inf, inf, 0, 3, 4] [inf, inf, inf, 0, 4] [5, 6, 8, 11, 0]
以上代码以一个包含5个节点和4条边的有向加权图为例,输出每两个节点间的最短距离。其中INF表示两个节点间不存在边。
相关文章