【问题标题】:Finding the minimum weight Dijkstra tree找到最小权重 Dijkstra 树
【发布时间】:2020-07-28 21:58:51
【问题描述】:

给定一个有向加权图 G=(V, E),运行 Dijkstra 算法可以生成多个具有不同权重的最短路径树as seen in this picture,其中 A 是源,D 是目标。如何创建一个算法,在运行 Dijkstra 算法 (O(V+E)logV) 的同时返回总权重最小的 Dijkstra 树?

【问题讨论】:

    标签: algorithm graph computer-science dijkstra


    【解决方案1】:

    通常您在 Dijkstra 运行时通过跟踪通向每个节点的最佳边来构建一棵树。例如,下面代码中的prev[] 数组通过记录通向每个节点的最优边来包含树;即,prev[] 数组包含树中每个节点的父节点:

     shortestPath(G, A, D, prev[])
          for v in G.V
              dist[v] = infinity
              prev[v] = -1 // no parent (assumes nodes are positive integers)
          dist[A] = 0
          for v in G.V
              Q.insert(v, dist[v])
          while Q not empty
              u = Q.deleteMin()
              if dist[u] >= infinity
                  return false  // no path to u
              if u == D
                  return true   // found path (don't stop if you want the whole tree)
              for all v adjacent to u
                  let d = dist[u] + v.weight
                  if d < dist[v]
                      dist[v] = d
                      prev[v] = u // update parent
                      Q.decreaseKey(v, d)
    

    由于prev[]记录了每棵树的父节点,你可以通过回溯找到最优路径:

      v = D
      while v >= 0
         path.addFirst(v)
         v = prev[v]
    

    无论如何,prev[] 持有树。如果您希望树采用不同的形式,您只需发布流程prev[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      相关资源
      最近更新 更多