【问题标题】:Find the Optimal vertex cover of a tree with k blue vertices找到具有 k 个蓝色顶点的树的最优顶点覆盖
【发布时间】:2018-09-26 18:30:48
【问题描述】:

我需要为以下问题找到一种“动态编程”的解决方案:

输入:

  • 完美二叉树T = (V,E) - (每个节点除了叶子节点外正好有 2 个子节点)。
    V = V(blue ) ∪ V(黑色)。 V(蓝色) ∩ V(黑色) = ∅.

(换句话说,树中的一些顶点是蓝色的)

  • 树的根'r'
  • 整数 k

合法的解决方案:

顶点 V' ⊆ V 的子集,它是 T 的 顶点覆盖,并且 |V' ∩ V(blue)| = k。 (也就是说,覆盖V'包含k个蓝色顶点)


解决方案价值:

合法解 V' 的值是集合中的顶点数 = |V'|。 为方便起见,我们将“非法”解的值定义为∞。


我们需要找到什么:

具有最小价值的解决方案。

(换句话说,最好的解决方案是一个覆盖恰好包含k个蓝色顶点顶点数在集合中是minimal。)


我需要定义一个典型的子问题。 (例如,如果我知道子树的价值解决方案是什么,我可以使用它来找到问题的价值解决方案。)

并提出一个公式来解决它。

【问题讨论】:

  • 这看起来像家庭作业。如果您有一个函数可以计算出包含根的树的最佳解决方案,以及另一个不包含根的最佳解决方案。然后您可以将其应用于左右树。如果两个最佳解决方案都包括左右树的根,那么你就完成了,否则你需要包括根以确保根被覆盖。然后,您可以递归地使用它。如果你memoize / DP,那么应该是O(N)

标签: algorithm graph tree minimum cover


【解决方案1】:

对我来说,看起来你是在正确的轨道上! 尽管如此,我认为您将不得不使用一个额外的参数来告诉我们任何选择的顶点距离当前子树的根有多远。 例如,它可以只是我们是否选择当前顶点的指示,如下所示。

fun (v, b, p) 是根为v 的子树的最佳大小,这样,在这个子树中,我们准确地选择b 蓝色顶点,如果我们选择顶点vp = 0,则选择p = 1,如果我们没有。

答案是fun (r, k, 0)fun (r, k, 1) 中的最小值:我们想要完整树的答案(v = r),恰好k 顶点被蓝色覆盖(b = k),我们可以挑或不挑根。

现在,我们如何计算这个? 对于叶子,fun (v, 0, 0)0fun (v, t, 1)1,其中t 告诉我们顶点v 是否为蓝色(1 如果是,0 如果不是)。 所有其他组合都是无效的,我们可以通过说各自的值是正无穷来模拟它:例如,对于叶顶点v,值fun (v, 3, 1) = +infinity。 在实现中,无穷大可以是大于任何可能答案的任何值。

对于所有内部顶点,设v 为当前顶点,uw 为其子顶点。 我们有两个选择:选择或不选择顶点v

假设我们选择它。 那么我们为f (v, b, 1) 得到的值是1(选择的顶点v)加上fun (u, x, q) + fun (w, y, r) 的最小值,这样x + y 要么是b,如果顶点v 是黑色或b - 1如果它是蓝色的,并且qr 可以是任意的:如果我们选择了顶点v,那么边缘v--uv--w 已经被我们的顶点覆盖。

现在让我们不要选择顶点v。 那么我们得到的f (v, b, 0) 的值只是fun (u, x, 1) + fun (w, y, 1) 的最小值,这样x + y = b:如果我们没有选择顶点v,那么边v--uv--w 必须被@987654366 覆盖@ 和w

【讨论】:

  • 那么一棵有 1 片黑叶且 k=1 的树呢?它应该是无穷大,我怎么看你的公式?它的 min {f(v,1,1), f(v,1,0)} 't' 在这里不起作用,因为它告诉我们叶子的颜色是什么?这是一个不同的“极端情况”吗?
  • @Dex119 在我看来,对于黑叶,我们有fun (v, 0, 0) = 0fun (v, 0, 1) = 1,因为这里有t = 0。所有其他值都是无穷大:fun (v, 1, 0) = +infinityfun (v, 1, 1) = +infinity。所以,最小值也是无穷大,这是正确的。
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 2013-09-04
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多