如何找到具有 k 个负权重边的最短路径?
How to Find shortest paths with k negative weighted edges?
问题是找到从起始顶点到所有其他顶点的最短路径在 directed graph
.
但是图会有m positive
个加权边和k negative
个加权边,并且保证负加权边不会在循环中。也就是说,这个图中没有负权重循环。
我试图直接使用 Bellman-Ford
和 SPFA
来解决这个问题,但是有没有更快的方法来解决这个问题?
如果 k 足够大,您可能应该只 运行 Bellman–Ford 收工。
如果 k 很小,您可以借鉴 Johnson 算法的重新加权技巧,但初始化速度比仅 运行ning Bellman–Ford 更快。回想一下,Johnson 计算了每个顶点的潜在 π(v) 并将每个弧 vw 的成本从 c(vw) 调整为 c′(vw) = c(vw) − π(v) + π(w),选择 π因此 c' 无处为负。 s 和 t 之间的最短路径关于 c 和关于 c',
假设输入图 G 恰好有一个负弧,假设 c(xy) < 0。使用 Dijkstra 算法计算 G − xy 中从 y 到所有其他顶点的距离。然后定义 π(v) = distance(y, v)。正确性证明遵循约翰逊算法的证明;弧 xy 不能是从 y 开始的最短路径的一部分,因为没有负循环,因此 G - xy 上的 Dijkstra 实际上计算了 G 的最短路径树。
对于一般的k,我们可以递归的进行。如果 k = 0,运行 Dijkstra。否则,移除负弧并递归计算最短路径,而不是使用 Dijkstra。一旦我们有了良好的 π 值,运行 Dijkstra 再一次,从给定的起始顶点开始。
总的 运行 宁时间是 O((k + 1) (m + n log n)) 与斐波那契堆。
问题是找到从起始顶点到所有其他顶点的最短路径在 directed graph
.
但是图会有m positive
个加权边和k negative
个加权边,并且保证负加权边不会在循环中。也就是说,这个图中没有负权重循环。
我试图直接使用 Bellman-Ford
和 SPFA
来解决这个问题,但是有没有更快的方法来解决这个问题?
如果 k 足够大,您可能应该只 运行 Bellman–Ford 收工。
如果 k 很小,您可以借鉴 Johnson 算法的重新加权技巧,但初始化速度比仅 运行ning Bellman–Ford 更快。回想一下,Johnson 计算了每个顶点的潜在 π(v) 并将每个弧 vw 的成本从 c(vw) 调整为 c′(vw) = c(vw) − π(v) + π(w),选择 π因此 c' 无处为负。 s 和 t 之间的最短路径关于 c 和关于 c',
假设输入图 G 恰好有一个负弧,假设 c(xy) < 0。使用 Dijkstra 算法计算 G − xy 中从 y 到所有其他顶点的距离。然后定义 π(v) = distance(y, v)。正确性证明遵循约翰逊算法的证明;弧 xy 不能是从 y 开始的最短路径的一部分,因为没有负循环,因此 G - xy 上的 Dijkstra 实际上计算了 G 的最短路径树。
对于一般的k,我们可以递归的进行。如果 k = 0,运行 Dijkstra。否则,移除负弧并递归计算最短路径,而不是使用 Dijkstra。一旦我们有了良好的 π 值,运行 Dijkstra 再一次,从给定的起始顶点开始。
总的 运行 宁时间是 O((k + 1) (m + n log n)) 与斐波那契堆。