标记顶点以创建最低成本

时间:2016-12-31 16:22:33

标签: algorithm dynamic

我有这个问题:

给你一个有根的树T,代表公司的层次结构,和 你想用T,1,2或3整数标记T中的每个节点,这样每个节点都有一个 与其父母不同的标签。标签的成本是具有的节点数 比父母更小的标签。描述和分析计算算法 给定树的任何标签的最低成本T.

如何使用动态编程解决此问题?

2 个答案:

答案 0 :(得分:0)

对于每个节点i,您需要计算其子树标记的最低成本,假设当前节点i具有标签12或{{ 1}}。 知道当前节点的每个子节点的那些值,就可以计算当前节点的这些值。

您可以使用3种算法实现它。

答案 1 :(得分:0)

谢尔盖有正确的想法,但由于这是一般树,因此在组合步骤中有一些微妙之处,应避免指数爆炸。

让我们使用以下数据结构表示树。

data Tree = Node | Edge Tree Tree

在英语中,树是单个节点或子树,其根是整个根的子节点和树的其余部分。例如,树

  *
 /|\
* * *
  |
  *

表示为Edge Node (Edge (Edge Node Node) (Edge Node Node))

现在,让我们定义一个递归过程dp',该过程采用树并在三种情况下返回着色成本:root为1,root为2,root为3。

dp' :: Tree -> (Int, Int, Int)
dp' Node = (0, 0, 0)
dp' (Edge a b) = let
    (a1, a2, a3) = dp' a
    (b1, b2, b3) = dp' b in
    (min               (a2     + b1) (a3 + b1)
    ,min (a1 + 1 + b2)               (a3 + b2)
    ,min (a1 + 1 + b3) (a2 + 1 + b3)
    )

例如,值(a1 + 1 + b2)表示设置root(a) -> 1root(b) -> 2的费用,因1&#39而产生root(a)的额外费用; s值小于root(b)的值,root(a)的父级为root(b)

总体答案是

dp :: Tree -> Int
dp a = let (a1, a2, a3) = dp' a in min (min a1 a2) a3