【发布时间】:2019-02-08 23:24:55
【问题描述】:
我在学校过去的一些考试中被问到了一个问题,但我找不到答案。
在图表上运行Johnson Algorithm 后是否有可能知道最终矩阵,以知道它以前是否有负循环?为什么?
约翰逊算法
约翰逊算法是一种能够计算图上最短路径的技术。只要不存在负权重的循环,它就能够处理边上的负权重。
算法包括(来自Wikipedia):
- 首先,将一个新节点
q添加到图中,通过零权重边连接到其他每个节点。 - 其次,使用Bellman–Ford算法,从新的顶点
q开始,为每个顶点v找到从q的路径的最小权重h(v)到v。如果这一步检测到负循环,则算法终止。 - 接下来,使用 Bellman–Ford 算法计算的值重新加权原始图的边:从
u到v的边,长度为w(u, v),被赋予新长度w(u,v) + h(u) − h(v)。 - 最后,
q被移除,Dijkstra 的 算法用于找到从每个节点s到重新加权图中每个其他顶点的最短路径。
【问题讨论】:
-
您能否详细说明您的问题?也许举个例子。这样一来,您的问题就会吸引更多的人,更容易理解、自成一体,并帮助更多人找到您的问题。
-
您的意思是说“如果它以前有负边”而不是“如果它以前有负循环”吗?因为如果存在负循环,约翰逊的算法就会中止。
-
是的,我的缺点是负面的。我不知道如何详细说明,因为这是我发现问题的方式,我也很困惑。
-
“知道最终矩阵” - 你的意思是知道距离矩阵?
-
您同意@ShaharA 的建议还是“最终矩阵”指的是更新后的非负边权重?如果是后者,那么您无法判断,因为在具有非负权重的图上运行 Johnson 会使它们保持不变。
标签: algorithm graph-algorithm shortest-path dijkstra bellman-ford