当前位置: 首页 > 知识库问答 >
问题:

为什么Dijkstra的算法对负权边不起作用?

庄新翰
2023-03-14

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

共有1个答案

谭修竹
2023-03-14

回想一下,在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

编辑一个稍微深一点的解释:

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

它的思想是:如果我们有一个开放的顶点,使得它的代价是最小的--通过在任何顶点上添加任何正数--最小性永远不会改变。
没有对正数的约束--上述假设不成立。

 类似资料:
  • 我正在为一个学校项目创建一个游戏,我想将Dijkstra的算法作为AI的一部分,用于玩家需要躲避的对象。 所以我有一个图(一个邻接矩阵),我想使用Dijkstra来获得从每个对象到玩家的路径,但是现在当我调用算法时,如果玩家在对象之后,它将不会找到玩家。 在我的理解中,Dijkstra的算法应该访问所有节点,直到它找到目的地,但在我的情况下没有。 到目前为止,我的算法是这样的: 在这种情况下, 是

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

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

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

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

  • 问题内容: 这是我所拥有的: 我是编程新手,所以如果这段代码看起来不成熟,我不会感到惊讶。无论如何,我让用户输入了一年零一个月(前三个字母)。我为a年创建了一个布尔变量,该变量表示用户输入的任何年份都需要被4、100和400整除。然后,我创建了一个if语句,以确认是否是a年才能打印出“ Feb(任何年份用户输入)中有DaysLeapYear。” 我认为我的算法有问题,因为如果我要取出TwentyE