当前位置: 首页 > 面试题库 >

为什么Dijkstra的算法不适用于负负边缘?

黄飞翮
2023-03-14
问题内容

有人可以告诉我为什么Dijkstra的单源最短路径算法假设边必须为非负。

我说的只是边缘,而不是负重量循环。


问题答案:

回想一下,在Dijkstra的算法中,将 某个顶点标记为“封闭”(且不在开放集内)-该算法找到了到达该顶点的最短路径 ,并且不再需要再次开发此节点-
它假定为此开发了路径路径是最短的。

但是负数-可能不正确。例如:

       A
      / \
     /   \
    /     \
   5       2
  /         \
  B--(-10)-->C

V={A,B,C} ; E = {(A,C,2), (A,B,5), (B,C,-10)}

来自A的Dijkstra首先开发C,后来找不到 A->B->C

编辑 更深入的解释:

注意,这很重要,因为在每个松弛步骤中,算法都假定“关闭”节点的“成本”确实很小,因此接下来要选择的节点也是最小的。

它的想法是:如果我们有一个开放的顶点,使得它的成本最小-通过向任何顶点添加任何 正数 -最小值将永远不会改变。
如果没有对正数的限制-上述假设是不正确的。

由于我们“知道”每个“闭合”的顶点都是最小的-我们可以安全地执行松弛步骤-而无需“回头”。如果确实需要“回头看”,Bellman-
Ford会
提供类似递归(DP)的解决方案。



 类似资料:
  • 我说的只是边缘,而不是负权重循环。

  • 但为什么?当我们在原始权重前面加上一个负的时,我认为大多数涉及权重的图问题都可以平等地处理,对吗?

  • 问题内容: 任何人都可以阐明为什么实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比。调用它或类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是吗 该文档似乎没有说。 问题答案: IEEE 754格式保留一位用于符号,其余位表示幅度。这意味着它在origo周围是“对称的”(与In

  • 我知道Bellman-Ford算法可以很好地处理负权重图,但我开发了一个Dijkstra算法代码,它工作得非常好。但当我插入负加权边时,它失败了。有解决办法吗?

  • 问题内容: 任何人都可以阐明为什么实际不能使用的最小值吗?它是一个正值,而Double可以当然是负值。 我理解为什么它是一个有用的数字,但它似乎是一个非常不直观的名称,尤其是与相比。 调用它或类似名称将具有更清晰的语义。 另外,Doubles可以取的最小值是多少?是-Double.MAX_VALUE吗 该文档似乎没有说。 问题答案: IEEE 754格式保留一位用于符号,其余位表示幅度。这意味着它

  • 我一直试图理解Dijkstra算法的内在原理,以找到加权图的最短路径。 在访问一个顶点后,为什么我们必须将相邻顶点存储到优先级队列而不是普通队列中? 我问上述问题的原因是:我知道使用PriorityQueue,我们可以从队列中获得最大/最小的数字。但是在Dijkstra算法的情况下,我们无论如何都会访问所有的顶点,而不管距离/优先级如何。在这种情况下,为什么我们需要使用具有O(log N)复杂度的

  • 假设我们有一个有向图,它同时包含正加权边和负加权边。 我知道最短路径解决方案是Bellman-Ford算法。 我的问题是:为什么我们不能只是在所有的边成本上增加一些大的值N,这样就不再有负边了,然后使用效率高得多的Dijkstra算法?

  • 首先定义Dijkstra算法: Dijkstra的算法在有向图中寻找具有非负边权的单源最短路径。 如果我有源和目的地T,我可以用Dijkstra算法在这两个顶点之间找到一条最短路径,但这里的问题是我想找到这两个顶点之间的最短路径,这两个顶点之间的边数不超过形式k。 第一部分是Dijkstra算法,第二部分是BFS算法,因为我们可以用BFS算法在无权图中找到最短路径。 所以我想知道有没有一种方法,可