最小顶点覆盖
Posted
技术标签:
【中文标题】最小顶点覆盖【英文标题】:Minimum vertex cover 【发布时间】:2016-03-20 05:55:05 【问题描述】:我正在尝试为具有 50,000 个顶点的“几乎”树获取顶点覆盖。该图生成为一棵树,添加了随机边以使其“几乎”成为一棵树。
我使用了近似方法,您将两个顶点结合在一起,将它们添加到封面并从图中删除它们,然后转到另一组顶点。之后,我尝试通过删除所有邻居都在顶点覆盖内的顶点来减少顶点的数量。
我的问题是如何使顶点覆盖更小?我正在尝试尽可能低。
【问题讨论】:
这一切都取决于:有多少随机边?我们知道有 49999 条树边,但对 20 条随机边实用的算法不会适用于 1000000 条。 我没有确切的数字,但大约 1/3 的边缘是多余的。 【参考方案1】:这是一个想法,但我不知道这是否是实践中的改进:
来自https://en.wikipedia.org/wiki/Biconnected_component “任何连通图都分解成双连通组件树,称为图的块切割树。”此外,您可以在线性时间内计算这种分解。
我建议当您合并并删除两个顶点时,您只对同一双连通组件中的两个顶点执行此操作。当您用完要合并的顶点时,您将拥有一组不相互连接的树。树上的顶点覆盖问题可以通过动态规划来解决:对于每个节点,如果该节点被添加到覆盖中并且如果该节点没有被添加到覆盖中,则计算最佳答案的成本。给定子节点的最佳答案,您可以计算节点的答案。
另一种方法 - 据我所知 - 将计算图的最小生成树并使用动态编程来计算该树的最佳顶点覆盖,忽略树外的链接,删除覆盖的链接图形,然后像以前一样继续合并顶点。
我认为我更喜欢最小生成树之一。在生成最小生成树时,您正在删除少量链接。一棵有 N 个节点的树有 N-1 个链接,所以即使你没有取回原来的树,你也会得到一个与它一样多的链接。完整图的顶点覆盖也是最小生成树的顶点覆盖,因此如果完整图的正确答案具有 V 个顶点,则对于具有最多 V 个顶点的最小生成树的答案。如果有 k 个随机边添加到树中,则需要添加 k 个边(不一定相同)以将最小生成树变成完整图。您当然可以确保这些新边最多被 k 个顶点覆盖。因此,如果最优答案有 V 个顶点,您将获得一个最多有 V+k 个顶点的答案。
【讨论】:
我实际上可以通过做一些其他事情来降低很多。我没有使用婚姻近似,而是在寻找叶子,我会删除这些叶子的邻居。然后在没有叶子之后,我会寻找度数最高的顶点并将其删除。由于删除一个顶点也会删除所有从它出来的边,我会一直这样做,直到图中的每个顶点的度数都为 0。但是谢谢你的建议。我会尝试实现它,看看我是否可以更低! @Ccyan:选择叶子的邻居是众所周知且有效的保持最优性的减少。还有其他几个,例如 Crown reduction,在固定参数可追踪性领域众所周知(其中 Vertex Cover 是研究得最充分的问题之一)——请查看那里的文献了解更多信息。【参考方案2】:这是一个精确答案的尝试,当只添加少量链接时,或者当它们不会改变节点间距离时,它是易于处理的。
找到最小生成树,将边分为“树边”和“添加边”,其中树边形成最小生成树,添加边不是为此选择的。它们可能不是在构造过程中实际添加的边缘,但这并不重要。 N 个节点上的所有树都有 N-1 条边,因此我们添加的边数与创建期间使用的相同,即使边数不同。
现在假设您可以偷看书后的答案,足以看到,对于每个添加的边的一个顶点,该顶点是否是最佳顶点封面的一部分。如果是,您可以从问题中删除该顶点及其链接。如果不是,则必须是另一个顶点,以便您可以从问题中删除它及其链接。
您现在必须为一棵树或许多断开连接的树找到一个最小顶点覆盖,我们知道如何做到这一点 - 请参阅我的其他答案以了解更多信息。
如果您无法从书后偷看答案,并且有 k 个附加边,请尝试书后可能出现的所有 2^k 个可能的答案,并找到最佳答案。如果幸运,那么添加的链接 A 与添加的链接 B 位于不同的子树中。在这种情况下,您可以将添加链接 A(或 B)的两种可能性所需的两个计算限制为相关子树的动态规划计算,因此你只是把工作翻了一番,而不是翻了两番。一般来说,如果你的 k 个添加的边在 k 个不相互干扰的不同子树中,则成本乘以 2 而不是 2^k。
【讨论】:
【参考方案3】:最小顶点覆盖是一个 NP 完全算法,这意味着即使是 100 个顶点(更不用说 50k),你也无法在合理的时间内解决它。
对于一棵树,有一个基于 DFS 的多项式时间贪婪算法,但是您“添加了随机边”这一事实搞砸了一切,使该算法无用。
Wikipedia has an article about approximation algorithm,声称它达到了因子 2,并声称没有更好的算法已知,这使得您不太可能找到一个。
【讨论】:
当图是一棵树加上少量添加的边时,我相信你可以做得更好。这并不试图为一般情况产生更好的近似值。我已经编辑了我的答案,为这个想法的成本提供了一个上限。 我正在做近似值,只是想知道是否有更好的方法可以进一步减少它。 @mcdowella 如果您有一千个中的额外边数很少(1-2),则可以这样做,但在 OPs 的情况下,它是额外边数的 1/3,在我的意见太多了以上是关于最小顶点覆盖的主要内容,如果未能解决你的问题,请参考以下文章