Floyd-Warshall算法路径追踪的更新规则正确性探讨
Floyd-Warshall算法路径追踪的更新规则疑问
维基百科给出了Floyd-Warshall算法带路径追踪的伪代码,但我对其中的更新规则存在疑问:原逻辑使用dist[i][k] + dist[k][j]更新dist[i][j],是否应替换为graph[i][k] + dist[k][j](其中graph[i][k]为边(i,k)的权重)?若i到k的路径长于一条边,原路径追踪逻辑可能无法正确工作。此外,若修正规则成立,该版本还可用于追踪路径跳数,比如寻找不超过N跳的最短路径。
procedure FloydWarshallWithPathReconstruction() is 对每条边 (u, v) 执行: dist[u][v] = w(u, v) // 边(u, v)的权重 prev[u][v] = u 对每个顶点 v 执行: dist[v][v] = 0 prev[v][v] = v 对 k 从 1 到 |V| 执行:// 标准Floyd-Warshall实现 对 i 从 1 到 |V| 执行: 对 j 从 1 到 |V| 执行: 如果 dist[i][j] > dist[i][k] + dist[k][j] 则 // 是不是应该改成 dist[i][j] > graph[i][k] + dist[k][j]??? dist[i][j] = dist[i][k] + dist[k][j] // 是不是应该改成 dist[i][j] = graph[i][k] + dist[k][j]??? prev[u][v] = prev[k][j] procedure Path(u, v) is 如果 prev[u][v] = null 则 返回 [] path = [v] 当 u ≠ v 时: v = prev[u][v] path.prepend(v) 返回 path
内容的提问来源于stack exchange,提问作者RomanGirin
相关产品推荐
相关产品推荐

