我对Dijkstra算法的理解正确吗?

时间:2018-11-01 09:30:00

标签: algorithm graph-algorithm dijkstra

请考虑以下加权有向图:

enter image description here

让我们考虑节点1作为起始节点,根据Dijkstra算法,我们执行以下步骤:

  1. 节点1标记为已访问。

  2. 到节点2的最短路径的权重为1。标记已访问节点2。

  3. 到节点3的最短路径的权重为30。标记已访问节点3。 此后,根据算法,节点3的最小路径权重为30,并且无法更改。 但是,显然,到node3的最短路径是4。

能否请您指出我对算法的解释中的任何缺陷?

2 个答案:

答案 0 :(得分:3)

简短的回答是“否”,您的理解不正确。

这是正确的算法:

  

Dijkstra的算法选择距离最小的未访问顶点,计算通过该顶点到每个未访问邻居的距离,如果更小,则更新邻居的距离。和邻居做完事后,马克就去了(设为红色)。

来源:https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

您的缺点是我们选择了成本最低的未访问顶点。

答案 1 :(得分:2)

下表说明了算法的所有步骤。第一列显示了被访问的节点,第二列显示了已经浏览(但尚未被访问)的节点以及当前访问的节点的邻居。所有节点均表示为三元组(n, d, p),其中n是节点名称,d是距起始节点的距离,而p是先前节点。正如其他答案和评论已经提到的那样,您将始终以最小的距离访问探索的节点:

visited node | explored nodes
-------------+-------------------------
(1, 0, -)    | (2, 1, 1) (3, 30, 1)
(2, 1, 1)    | (3, 30, 1) (4, 2, 2)
(4, 2, 2)    | (3, 30, 1) (5, 3, 4)
(5, 3, 4)    | (3, 4, 5)     //distance of node 3 is updated
(3, 4, 5)    | 

因此,到节点3的路径实际上遍历了所有其他节点。