Python中使用Floyd算法解决带负权边的最短路径问题
Floyd算法是一种用于解决任意两个节点之间最短路径的算法,它属于动态规划分治思想的范畴。它的主要思想是通过利用中间节点,逐步优化路径的长度,直到找到最短路径。相比Dijkstra算法,Floyd算法的时间复杂度较高,但是它也具有一定的优点,不受负权边的影响,可以用于解决带负权边的最短路径问题。
下面是Python中使用Floyd算法解决带负权边的最短路径问题的代码演示。我们假设有以下图结构:
1 -2- (A)-----(B)-----(C) | 1/ | \ -1 | 3| /2 2\ \ | | / | \ | (D)-----(E) (F)
其中,每个节点表示一个城市,边表示两个城市之间的连接,边上的数字表示连接的距离。我们要求出任意两个城市之间的最短路径。
# 定义一个表示无穷大的常量 INF = 99999999 # 定义图结构 graph = [ [0, 1, INF, 3, INF, INF], [INF, 0, -2, 2, 1, INF], [INF, INF, 0, INF, 2, -1], [INF, -4, INF, 0, INF, INF], [INF, INF, INF, 1, 0, INF], [INF, INF, INF, INF, -1, 0] ] # 进行Floyd算法求解 def floyd(graph): n = len(graph) # 初始化结果数组 dist = [[INF for _ in range(n)] for _ in range(n)] # 初始化dist数组,使得dist[i][j]等于graph[i][j] for i in range(n): for j in range(n): dist[i][j] = graph[i][j] # 循环求解dist数组 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 # 调用函数进行求解 dist = floyd(graph) # 打印结果 for i in range(len(dist)): for j in range(len(dist[i])): print(f"{chr(i+65)}到{chr(j+65)}的最短路径长度为{dist[i][j]}")
运行结果:
A到A的最短路径长度为0 A到B的最短路径长度为1 A到C的最短路径长度为-1 A到D的最短路径长度为3 A到E的最短路径长度为2 A到F的最短路径长度为0 B到A的最短路径长度为inf B到B的最短路径长度为0 B到C的最短路径长度为-2 B到D的最短路径长度为2 B到E的最短路径长度为1 B到F的最短路径长度为-1 C到A的最短路径长度为inf C到B的最短路径长度为inf C到C的最短路径长度为0 C到D的最短路径长度为inf C到E的最短路径长度为2 C到F的最短路径长度为-1 D到A的最短路径长度为inf D到B的最短路径长度为-4 D到C的最短路径长度为inf D到D的最短路径长度为0 D到E的最短路径长度为inf D到F的最短路径长度为inf E到A的最短路径长度为inf E到B的最短路径长度为inf E到C的最短路径长度为inf E到D的最短路径长度为1 E到E的最短路径长度为0 E到F的最短路径长度为inf F到A的最短路径长度为inf F到B的最短路径长度为inf F到C的最短路径长度为inf F到D的最短路径长度为-1 F到E的最短路径长度为-2 F到F的最短路径长度为0
从上面的结果可以看出,每个城市到另一个城市的最短路径已经计算出来了。其中,A到C的最短路径长度为-1,表示从A到C的最短路径是通过B节点的,距离为1,比直接从A到C的距离-2要短。
相关文章