首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求最小权重Dijkstra树

求最小权重Dijkstra树
EN

Stack Overflow用户
提问于 2020-07-29 05:58:52
回答 1查看 119关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 06:36:43

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

代码语言:javascript
复制
 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[]记录了每棵树的父节点,因此您可以通过回溯找到最优路径:

代码语言:javascript
复制
  v = D
  while v >= 0
     path.addFirst(v)
     v = prev[v]

在任何情况下,prev[]都持有这棵树。如果你想要一个不同形式的树,你只需要post process prev[]即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63143404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档