【问题标题】:How to find the shortest path of a weighted tree?如何找到加权树的最短路径?
【发布时间】:2013-12-05 00:40:35
【问题描述】:

我有一棵看起来像的加权树(权重在括号中)

          A1
        /   \
     B1(3)  B2(2)
     /   \  /  \
   C1(1) C2(3) C3(4)
   /   \ /  \  /  \
 D1(8) D2(7) D3(2) D4(5) 
    ......

所以,每个节点都有两个孩子。每个节点与一个邻居节点共享一个子节点。树的深度可能非常高。

3 + 1 + 8 = 12
3 + 1 + 7 = 11
3 + 3 + 7 = 13 ... and so on

找到最短路径的最佳方法是什么?因此,我不需要权重的总和,而是完整的路径(比如说 A1-B2-C3-D3)。

如果您能向我推荐正确的算法,我将非常高兴。或者提供 java/伪代码解决方案。

谢谢!

更新

我正在寻找从上到下的完整路径

【问题讨论】:

  • 您是在寻找任意两个顶点之间的最短路径,还是从根节点开始的最短路径?
  • 这不是一棵树。一棵树在任意两个顶点之间应该只有一条路径。这基本上是一个二维网格。

标签: algorithm tree


【解决方案1】:

由于子共享属性,这可能是自然的动态规划 (DP) 问题。我建议使用自底向上的 DP 算法来解决这个问题。

  1. 将每个节点的状态定义为 SP(n),即从该节点出发的最短路径。我们可以注意到 SP(n) 仅依赖于 SP(c),其中 c 是 n 的子级。并且由于孩子共享属性,SP(n) 可能会被 n 的父母重用。
  2. 状态转换方程如下:

    SP(n) = min {对于 n 的每个 c 的孩子 | SP(c) + 重量(c)}

至于实现,我们从叶子中自下而上扫描以计算 SP(n),直到我们到达根。而且时间成本是 O(n),因为我们一次计算它。

【讨论】:

  • 我想添加使用自下而上方法的基本原理。取任何叶子l,它的祖先T 可以移动到ll 的兄弟姐妹。如果T 是最短路径的一部分,那么其权重最小的子叶(ll 的兄弟节点)也将成为最短路径的一部分。通过单独执行该步骤,您消除了一半的叶子作为可能性。
  • 你有任何参考或伪代码,我可以从中起草代码吗?对我来说仍然很难。
【解决方案2】:

您可能想查看Alpha-beta-pruning。该算法基本上会在已知搜索树已过时时立即删除部分搜索树,即已知到同一位置的较短路径。

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多