请考虑以下加权有向图:
让我们考虑节点1作为起始节点,根据Dijkstra算法,我们执行以下步骤:
节点1标记为已访问。
到节点2的最短路径的权重为1。标记已访问节点2。
到节点3的最短路径的权重为30。标记已访问节点3。 此后,根据算法,节点3的最小路径权重为30,并且无法更改。 但是,显然,到node3的最短路径是4。
能否请您指出我对算法的解释中的任何缺陷?
答案 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
的路径实际上遍历了所有其他节点。