为什么Dijkstra算法必须在每一轮中提取min?

时间:2017-04-05 17:47:27

标签: algorithm graph graph-algorithm shortest-path dijkstra

考虑该图对于应用Dijkstra算法是有效的,即没有负边缘权重。我很难说服自己Dijkstra的算法只有在选择每一轮中的最小距离节点被提取时才有效。什么构成提取除最小距离节点以外的任何东西的证据都会导致Dijkstra算法的失败? 我正在寻找一个好的论点,但欢迎支持的例子。

1 个答案:

答案 0 :(得分:5)

如果提取非最小节点,那么您将提取一个节点,在提取时未知最短距离。它将在稍后计算,但不再提取节点,因此最后将留下至少一个错误的最小距离。

示例:

enter image description here

您将拥有d[1] = 0,然后您将提取此内容,因为它是唯一要提取的内容。

这将设置:

d[3] = 3
d[2] = 1

现在你应该提取2,但是假设你提取3

您将设置d[4] = 4

现在假设你提取2并设置d[3] = 2

接下来,仅提取4。你提取它就完成了。

您的错误值为d[4] = 4而不是d[4] = 3

请注意,这假设您无法多次提取节点(在经典的Dijkstra算法中无法提取)。如果你允许这样做,那么你的建议确实有用,但可能效率不高,也不再是Dijkstra。