【问题标题】:Dijkstra Algorithm propertyDijkstra 算法属性
【发布时间】:2012-01-26 14:36:49
【问题描述】:
Dijkstra(G,w,s) {
  ISS(G,s);
  let S be an empty set
  let Q be a priority queue, initialized with V[G]
  while Q is not Empty:
       u<-extractMin(Q);
       add u to S
       for each vertex v neighbor of u
             Relax(u,v,w);
}

我的问题是,为什么在 while 循环中算法的每一步中选择 Q 中所有 v 的 MINIMUM d[v] 很重要,如果我们不选择最小值会发生什么?

我的意思是,从我的角度来看,所有边 (u,v) 都会以广度一阶放松(意味着如果 - s->u->v 和 (s,v) 不在 E 中,那么(s,u) 会在 (u,v)) 之前放松, 那么为什么每次都选择最小的 d[v] 很重要呢?

假设存在一个函数 extractMaxFiniteD(Q),它返回顶点 v,使得它的最大 d[v] 在 Q 中是有限的

假设我们将该行更改为 u

我知道这个问题可能非常困难和抽象,但如果 some1 可以帮助我解决这个问题会很棒。

【问题讨论】:

  • 你真的在任何图表上尝试过吗?使用 Max 会产生错误结果的概率非常高!
  • 我对特定图表不太感兴趣,我想了解我们试图通过选择最小的每一步来保留什么属性。
  • 如果你在几乎任何图表上这样做,一步一步地查看中间结果,你就会明白 min 的目的
  • 选择无穷大是不合法的,让我们假设 extractMaxFiniteD 返回顶点 v 使得它的最大 d[v] 在 Q 中是有限的,还是那么微不足道吗?

标签: algorithm computer-science graph-theory dijkstra


【解决方案1】:

Dijkstra 算法的主要思想是:当你从Q 中取出一个顶点时,这个顶点是好的。您将不必在未来放松它。

如果您从Q 中取出一个随机元素,则此条件不成立——一旦您从Q 中取出一个顶点v,就不能保证d[v] 确实是到@ 的最短路径987654326@.

如果你取最小值 - 这是有保证的,因为如果 vQ 中是最小值,那么对于 Qd[u] &gt;= d[v] 中的每个 u,因此无论你下一步做什么 - 你无法改善d[v]

【讨论】:

    【解决方案2】:

    示例:

    节点:a,b,c
    边(和权重): (a,b,1) (a,c,10) (b,c,1)

    在此尝试您的算法。你会发现到 c 的最小成本路径是 10,而它显然是 2。

    当您从 Q 中移除一个节点时,您不会再放松它,如果您移除一个成本最高的节点,那么您就不会考虑使用成本较低的方法来到达该节点。

    如果您不想从 Q 中选择最小节点,那么您也不能将其从 Q 中删除,您必须将其保留在集合中,以便在以后的迭代中可以放松。这基本上就是bellman-ford 算法的作用。

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多