Floyd算法,又称Floyd-Warshall算法,是一种计算图中所有最短路径的动态规划算法。它可以处理包括负权边(但不能处理负权环)的加权图。以下是Floyd算法的基本实现思路及一个简单的Python实例代码。
### Floyd算法实现思路
1. **初始化**:首先,将图的邻接矩阵初始化,如果顶点i到顶点j有边,则邻接矩阵的`dist[i][j]`为边的权重;如果顶点i到顶点j无边,则`dist[i][j]`为无穷大(在程序中通常用一个很大的数表示,如`float('inf')`)。对于每个顶点v,`dist[v][v]`为0。
2. **三层循环**:
- 外层循环遍历所有顶点k,作为中间顶点。
- 中间循环遍历所有起点i。
- 内层循环遍历所有终点j。
- 如果从i到k的距离加上从k到j的距离小于直接从i到j的距离,则更新`dist[i][j]`为更小的值。
3. **结果**:经过上述三层循环后,`dist[i][j]`中存储的就是i到j的最短路径长度。
### Python实例代码
import sys
# 初始化图的邻接矩阵
def init_graph(n):
dist = [[float('inf')] * n for _ in range(n)]
for i in range(n):
dist[i][i] = 0
return dist
# Floyd算法实现
def floyd_warshall(dist, n):
for k in range(n):
for i in range(n):
for j in range(n):
if dist[i][k] + dist[k][j] < dist[i][j]:
dist[i][j] = dist[i][k] + dist[k][j]
# 示例图的邻接矩阵
# 注意:这里假设图是无向的,且边的权重为1(除了直接相连的边外,其他边的权重默认为无穷大)
n = 4 # 顶点数量
edges = [(0, 1), (1, 2), (2, 3), (3, 0), (1, 3)] # 示例边
dist = init_graph(n)
for u, v in edges:
dist[u][v] = 1
dist[v][u] = 1 # 因为是无向图
floyd_warshall(dist, n)
# 输出结果
for row in dist:
print(row)
注意:上述代码中的`edges`列表仅用于初始化示例图的邻接矩阵,其中`(u, v)`表示顶点u和顶点v之间有边相连,且边的权重为1。在实际应用中,你可能需要根据具体的图结构和边的权重来初始化邻接矩阵。