贝尔曼-福特算法(Bellman-Ford algorithm)是一种用于解决单源最短路径问题的经典算法。它可以处理带有负权边的图,并且能够检测出负权回路。
下面给出了贝尔曼-福特算法的正确性证明和一个标准实现的代码示例。
正确性证明:
标准实现的代码示例(使用邻接矩阵表示图):
INF = float('inf')
def bellman_ford(graph, source):
n = len(graph)
distance = [INF] * n
distance[source] = 0
for _ in range(n-1):
for u in range(n):
for v in range(n):
if graph[u][v] != INF and distance[u] + graph[u][v] < distance[v]:
distance[v] = distance[u] + graph[u][v]
# 检查负权回路
for u in range(n):
for v in range(n):
if graph[u][v] != INF and distance[u] + graph[u][v] < distance[v]:
return "存在负权回路"
return distance
使用示例:
graph = [
[INF, 4, INF, INF, INF, INF, INF, 8, INF],
[4, INF, 8, INF, INF, INF, INF, 11, INF],
[INF, 8, INF, 7, INF, 4, INF, INF, 2],
[INF, INF, 7, INF, 9, 14, INF, INF, INF],
[INF, INF, INF, 9, INF, 10, INF, INF, INF],
[INF, INF, 4, 14, 10, INF, 2, INF, INF],
[INF, INF, INF, INF, INF, 2, INF, 1, 6],
[8, 11, INF, INF, INF, INF, 1, INF, 7],
[INF, INF, 2, INF, INF, INF, 6, 7, INF]
]
source = 0
result = bellman_ford(graph, source)
print("节点0到其他节点的最短距离:", result)
输出结果:
节点0到其他节点的最短距离: [0, 4, 12, 19, 21, 11, 9, 8, 14]
注意:这里的示例代码是基于邻接矩阵的表示方式,如果使用邻接表或其他方式表示图,算法的实现可能会有所不同。
上一篇:贝尔曼-福特算法的实现和同时松弛
下一篇:贝尔曼-福特算法对负环的解释