[英]Find the Optimal vertex cover of a tree with k blue vertices
我需要为以下问题找到一种“动态编程”解决方案:
输入:
(换句话说,树中的一些顶点是蓝色的)
法律解决方案:
顶点V'⊆V的子集,它是T的顶点覆盖 ,并且|V'∩V(蓝色)| = k 。 (换句话说,封面V'包含k个蓝色顶点)
解决方案价值
合法解V'的值是set = | V'|中的顶点数。 为方便起见,我们将“非合法”解决方案的值定义为∞。
我们需要找到什么:
价值最小的解决方案。
(换句话说,最好的解决方案是一个封面解决方案, 包含正好k个蓝色顶点,并且集合中的顶点数量 最小 。)
我需要定义一个典型的子问题。 (就像,如果我知道子树的价值解决方案是什么,我可以用它来找到问题的价值解决方案。)
并建议一个解决它的公式 。
对我来说,看起来你走在正确的轨道上! 不过,我认为你必须使用一个额外的参数来告诉我们从当前子树的根中获取的顶点有多远。 例如,它可以仅仅是我们是否选择当前顶点的指示,如下所示。
让fun (v, b, p)
成为具有root v
子树的最佳大小,使得在这个子树中,我们精确地选择b
蓝色顶点,如果我们选择顶点v
,则p = 1
如果我们不选择p = 0
。
答案是最小的fun (r, k, 0)
和fun (r, k, 1)
:我们想要完整树的答案( v = r
),恰好k
个顶点用蓝色覆盖( b = k
) ,我们可以选择或不选择根。
现在,我们如何计算呢? 对于叶子, fun (v, 0, 0)
为0
且fun (v, t, 1)
为1
,其中t
告诉我们顶点v
是否为蓝色(如果是,则为1
否则为0
)。 所有其他组合都是无效的,我们可以通过说相应的值是正无穷大来模拟它:例如,对于叶顶点v
,值fun (v, 3, 1) = +infinity
。 在实现中,无穷大可以是任何大于任何可能答案的值。
对于所有内部顶点,让v
为当前顶点, u
和w
为其子节点。 我们有两个选择:选择或不选择顶点v
。
假设我们选择它。 然后我们得到的f (v, b, 1)
是1
(拾取的顶点v
)加上最小的fun (u, x, q) + fun (w, y, r)
这样x + y
就是b
如果顶点v
是黑色或b - 1
如果它是蓝色,并且q
和r
可以是任意的:如果我们选择顶点v
,则边缘v--u
和v--w
已经被我们的顶点覆盖覆盖。
现在让我们不要选择顶点v
。 那么我们得到的f (v, b, 0)
值只是fun (u, x, 1) + fun (w, y, 1)
的最小值fun (u, x, 1) + fun (w, y, 1)
这样x + y = b
:如果我们没有选择顶点v
,边缘v--u
和v--w
必须由u
和w
覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.