问题描述
我们已经得到树,假设 T 的顶点集为 V,现在尝试给出一个算法来找到顶点 W 的最小基数子集。给定集合 V 中的每个顶点都有一个边集合 W 中的至少一个顶点。
解决方法
这可以通过递归算法在线性时间内解决。首先为树选择一个根,并为每个顶点构建一个子节点列表。如果子树中的每个顶点(可能除了子树的根)都在该集合中或与该集合的成员相邻,我们就说一组顶点“覆盖”了一个子树。
该算法将这棵树中的一个顶点 v
作为输入,并返回一个由三个数字组成的元组,它们是覆盖 v
的子树的子集的最小基数,它们分别 (a) 包括顶点v
,(b) 不包括v
,但至少包括v
的一个子节点,并且(c) 既不包括v
也不包括任何{{ 1}} 的孩子。
算法的基本情况是当输入 v
是叶节点时返回元组 (1,0)
。在递归情况下,元组 v
可以根据对 (a,b,c)
的子代递归调用算法的结果计算得出。我不会为您解决整个问题,而是让您自己弄清楚如何做到这一点。
最后的答案是 v
,其中 min(a,c+1)
是在根节点上调用算法的结果。