我一直试图解决为什么Dijkstra的算法不能处理负加权图,我理解所有有更多节点指向已经节点的节点的例子充分探索。但是这个例子让我很开心;
我认为这是正确的;首先探讨了A
。 A->B
将1
,A->C
将为100
。然后探索B
并将B->D
设置为2
。然后探索 D ,因为它目前有最短路径返回源(即优先级队列的顶部)?
如果B->D
100
为C
,A->D
将首先被探索(因为101
是D
),我是否正确? ?
人们在每个解释中都没有提到的一件事是,一个节点已被探索/访问过,它不能再被更新,因为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"> </td>
</tr>
</tbody>
</table>
</td>
<td>$30.9 sdfsdfd fgertwet</td>
</tr>
</tbody>
</table>
的原因很难理解。
答案 0 :(得分:1)
直截了当:当探索/访问/关闭使用Djikstra算法的节点时,这意味着您找到了到该节点的最短路径,因此该节点< strong>不需要重新开发或重新访问,您已经知道节点的最短路径。
例如,当您选择要探索的D时,PQ中有两条路径:
选择成本最低的路径。然后,显而易见的是,如果电弧成本始终为正,那么您无法找到通过A-C的D的最短路径。已找到D的最短路径,并且节点已关闭。
然而,当允许负弧成本时,所有这些推理都是不正确的,这就是为什么Djikstra算法不能用于它们的原因。
答案 1 :(得分:0)
我认为您描述的Dijkstra算法仅适用于正权重函数。特别地,Dijkstra算法在每个加权(正)图上给出有效的度量空间结构。另一方面,这似乎不是任意加权图的情况。例如,带有两个节点A和B的图形以及它们之间的一条边,重量为-5。在这种情况下,这不会给出A和B之间的距离。所以你所描述的,我认为会属于某种修改的Dijkstra模型,并且从一个节点到另一个节点的解释不再被解释为节点之间的距离