我是否正确地使用Dijkstra算法图来思考这个负权重?

时间:2017-02-08 00:49:31

标签: algorithm graph dijkstra

我一直试图解决为什么Dijkstra的算法不能处理负加权图,我理解所有有更多节点指向已经节点的节点的例子充分探索。但是这个例子让我很开心;

enter image description here

我认为这是正确的;首先探讨了AA->B1A->C将为100。然后探索B并将B->D设置为2。然后探索 D ,因为它目前有最短路径返回源(即优先级队列的顶部)?

如果B->D 100CA->D将首先被探索(因为101D),我是否正确? ?

人们在每个解释中都没有提到的一件事是,一个节点已被探索/访问过,它不能再被更新,因为Dijkstra在优先级队列上工作。在这种情况下,我发现在C之前访问<table width="600"> <tbody> <tr> <td> <span>Price:</span> </td> <td width="100%"> <table width="100%"> <tbody> <tr> <td style="width:100%;border-bottom:3px dotted #0b863c">&nbsp;</td> </tr> </tbody> </table> </td> <td>$30.9 sdfsdfd fgertwet</td> </tr> </tbody> </table>的原因很难理解。

2 个答案:

答案 0 :(得分:1)

直截了当:当探索/访问/关闭使用Djikstra算法的节点时,这意味着您找到了到该节点的最短路径,因此该节点< strong>不需要重新开发或重新访问,您已经知道节点的最短路径。

例如,当您选择要探索的D时,PQ中有两条路径:

  • A-B-D,费用为2
  • A-C,费用为100

选择成本最低的路径。然后,显而易见的是,如果电弧成本始终为正,那么您无法找到通过A-C的D的最短路径。已找到D的最短路径,并且节点已关闭。

然而,当允许负弧成本时,所有这些推理都是不正确的,这就是为什么Djikstra算法不能用于它们的原因。

答案 1 :(得分:0)

我认为您描述的Dijkstra算法仅适用于正权重函数。特别地,Dijkstra算法在每个加权(正)图上给出有效的度量空间结构。另一方面,这似乎不是任意加权图的情况。例如,带有两个节点A和B的图形以及它们之间的一条边,重量为-5。在这种情况下,这不会给出A和B之间的距离。所以你所描述的,我认为会属于某种修改的Dijkstra模型,并且从一个节点到另一个节点的解释不再被解释为节点之间的距离