【问题标题】:Is my understanding of Dijkstra algorithm correct?我对 Dijkstra 算法的理解正确吗?
【发布时间】:2019-04-05 12:14:27
【问题描述】:

考虑以下加权有向图:

我们把节点1作为起始节点,根据Dijkstra算法我们有以下步骤:

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

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

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

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

【问题讨论】:

  • 第2步已经开始出错了,请再看一下算法的描述。

标签: algorithm graph-algorithm dijkstra


【解决方案1】:

简短的回答是否定的,你的理解是不正确的。

这是正确的算法:

Dijkstra 的算法选择距离最短的未访问顶点,计算通过它到每个未访问邻居的距离,如果更小,则更新邻居的距离。与邻居完成后标记已访问(设置为红色)。

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

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

【讨论】:

    【解决方案2】:

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

    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 的路径实际上按预期遍历了所有其他节点。

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 2012-01-27
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多