查找访问树的所有节点的最低成本

时间:2016-04-27 07:29:24

标签: algorithm tree graph-theory greedy

给定树的根,其中每条边具有相关的成本。找到访问树的每个节点的最低成本。

我想到的一个递归解决方案是:

  1. 当节点是叶返回0时的基本情况。
  2. 对于节点的每个子节点c递归计算成本。
  3. 将所有这些费用加起来,并且从节点到子节点两次添加边缘成本两次(因为我们需要回溯)。
  4. 减去具有最高费用的孩子的边缘成本。("贪婪" - 我们不想从具有最高成本的孩子回溯)。
  5. 这种做法是否正确?

    有没有更好的方法来解决问题?

2 个答案:

答案 0 :(得分:5)

  1. 访问节点中的所有子树,返回到节点,它将花费属于该子树的所有edges * 2
  2. 所以我们应该在树中找到一条路径成本最高的路径。我们只是通过路径,如果我们遇到一些不在路径中的节点,我们只需访问它并返回。 因此路径中的边缘只会访问一次,剩余的边缘将访问两次。
  3. 如何找到最高成本的路径?由于它是一棵树,你可以递归地找到它。
  4. 答案应该是:

    sum(cost(edge)*2) - sum(edge which in the path)
    

    我检查了你的解决方案,我认为这是错的(如果我误解了你的解决方案,请发表评论):

      

    减去具有最高费用的孩子的边缘成本。("贪婪" - 我们>不想从孩子那里回溯,这会带来最高的成本)。

    那个孩子将是一棵树,一些边缘必须访问两次。例如:

        A
       / \
      B   C
     / \
    D   E
    

    您无法访问所有边的子树一次以访问所有节点。

答案 1 :(得分:0)

1-除最后一个叶节点外,所有节点路径都将被访问两次。

2-我们需要找出哪个叶子节点附加了访问根节点的最高成本。

3-一旦我们发现这一点,我们将需要进行遍历,使得此叶节点是最后访问的节点。