Bellman-Ford
Bellman-Ford算法可用于求解负权图的最短路问题,时间复杂度为O(mn),劣于SPFA
对于访问边有频次限制的图求解最短路则只能使用Bellman-Ford算法
from copy import copy
# n 所有点的数量
# m 所有边的数量
# k 最大访问边数
n, m = [int(x) for x in input().split(" ")]
INF = 1e9
# dist
dist = [INF] * (n + 1)
dist[1] = 0
# backup
backup = [INF] * (n + 1)
edges = [[] for _ in range(m)]
for i in range(m):
edges[i] = [int(x) for x in input().split(" ")]
# 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,
# 由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
for _ in range(n):
backup = copy(dist)
for i in range(m):
a, b, w = edges[i]
dist[b] = min(dist[b], backup[a] + w)
if dist[n] > INF / 2:
print(-1)
else:
print(dist[n])
边数限制的最短路问题
from copy import copy
# n 所有点的数量
# m 所有边的数量
# k 最大访问边数
n, m, k = [int(x) for x in input().split(" ")]
INF = 1e9
# dist
dist = [INF] * (n + 1)
dist[1] = 0
# backup
backup = [INF] * (n + 1)
edges = [[] for _ in range(m)]
for i in range(m):
edges[i] = [int(x) for x in input().split(" ")]
for _ in range(k):
backup = copy(dist)
for i in range(m):
a, b, w = edges[i]
dist[b] = min(dist[b], backup[a] + w)
if dist[n] > INF / 2:
print(-1)
else:
print(dist[n])
最后更新于
这有帮助吗?