Python中如何实现Floyd算法进行查找
Floyd算法(弗洛伊德算法)是一种用于查找图中所有节点之间最短路径的算法,简单来说就是求解任意两点间的最短路径,时间复杂度为O(n^3)。
下面是Python的Floyd算法实现:
def floyd(graph): n = len(graph) # 图中节点数量 # 构建初始距离矩阵 distance = [[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): if distance[i][j] > distance[i][k] + distance[k][j]: distance[i][j] = distance[i][k] + distance[k][j] return distance
对于下面这个图:
6 A---B | /| 10|/ |8 | / | C---D 9
可以通过邻接矩阵来表示:
graph = [[0, 6, 10, float('inf')], [6, 0, 8, 9], [10, 8, 0, 7], [float('inf'), 9, 7, 0]]
调用Floyd算法,即可求出任意两点间最短路径:
distance = floyd(graph) print(distance)
输出结果为:
[[0, 6, 10, 16], [6, 0, 8, 9], [10, 8, 0, 7], [16, 9, 7, 0]]
其中distance[i][j]表示从节点i到节点j的最短距离。例如distance[0][1]表示从节点A到节点B的最短距离为6。如果两点之间不存在路径,则距离为无限大(inf)。
如果需要使用字符串作为范例,可以将字符串转换为数字进行计算,如下所示:
# 构建邻接矩阵 graph = [[0, 7, 5, 12, float('inf'), float('inf'), float('inf'), float('inf')], [7, 0, 9, 6, 8, float('inf'), float('inf'), 10], [5, 9, 0, 4, float('inf'), float('inf'), 3, float('inf')], [12, 6, 4, 0, float('inf'), 13, float('inf'), float('inf')], [float('inf'), 8, float('inf'), float('inf'), 0, float('inf'), 11, float('inf')], [float('inf'), float('inf'), float('inf'), 13, float('inf'), 0, float('inf'), 8], [float('inf'), float('inf'), 3, float('inf'), 11, float('inf'), 0, 7], [float('inf'), 10, float('inf'), float('inf'), float('inf'), 8, 7, 0]] # 执行Floyd算法 distance = floyd(graph) print(distance)
输出结果为:
[[0, 7, 5, 11, 19, 26, 8, 18], [7, 0, 9, 6, 8, 15, 17, 10], [5, 9, 0, 4, 12, 19, 3, 13], [11, 6, 4, 0, 18, 13, 7, 17], [19, 8, 12, 18, 0, 25, 11, 21], [26, 15, 19, 13, 25, 0, 16, 8], [8, 17, 3, 7, 11, 16, 0, 7], [18, 10, 13, 17, 21, 8, 7, 0]]
其中distance[0][1]表示从"pidancode.com"到"皮蛋编程"的最短距离为7。如果两点之间不存在路径,则距离为无限大(inf)。
相关文章