【发布时间】:2017-02-08 00:49:30
【问题描述】:
我一直在试图弄清楚为什么 Dijkstra 的算法不适用于负加权图,并且我了解所有示例,这些示例具有指向已充分探索的节点的进一步节点。但是这个例子让我很头疼;
我这样想对吗?首先探索A。 A->B 将是 1 和 A->C 将是 100。然后探索B 并将B->D 设置为2。然后探索 D 是因为目前它具有返回源的最短路径(即位于优先级队列的顶部)?
如果B->D 是100,C 将首先被探索(因为A->D 是101),我是否正确?
人们在每个解释中都没有真正提到的一件事是,一个节点已经被探索/访问过,它不能再更新了,因为 Dijkstra 工作在优先级队列上。在这种情况下,我很难理解为什么在C 之前访问了D。
【问题讨论】:
-
你说得对。该算法仅在节点从队列中移除时已知到该节点的最短路径时才有效,并且如果稍后某个节点可能与该节点有负权链接,则该算法不一定正确。
-
谢谢马特。你为什么不把它作为答案,我会打勾。我关于将 B->C 更改为 100 的第二个陈述是否正确?
-
我认为我的回答不会为网站增加很多价值,所以我会留下空间以防有人想提供一个很好的解释。是的,你的第二个说法是正确的。
-
它会失败,因为 Djikstra 的算法基于这样一个事实:当一个节点被探索/关闭时,已经找到了到该路径的最短路径。您不能说明图表中何时可能存在负权重。