1 回答

TA贡献2080条经验 获得超4个赞
对Floyd-Warshall算法进行修改:
保留一对(distance, k),其中k是更新距离值的中间顶点,而不是仅保留距离。k默认值为-1。
if distance[i][j][0] > distance[i][k][0] + distance[k][j][0]:
distance[i][j] = (distance[i][k][0] + distance[k][j][0], k)
您可以通过递归重建任何最短路径。
def get_path(i, j):
if distance[i][j] == +oo: # oo stand for infinite
return [] # None is also an option
k = distance[i][j][1]
if k == -1:
return [i, j]
else:
path = get_path(i, k)
path.pop() # remove k to avoid duplicates
path.extend(get_path(k, j))
return path
运行:O(length of path)
注意:获得从x到 的最小成本路径的要求y是从x到的任何路径之间不存在负成本循环y。
添加回答
举报