最小顶点覆盖

时间:2016-03-20 05:55:06

标签: algorithm vertex-cover

我正试图为#"几乎"树有50,000个顶点。图形生成为一棵树,其中添加了随机边缘,使其几乎成为"一颗树。

我使用近似方法将两个顶点结合起来,将它们添加到封面并从图形中移除它们,然后移动到另一组顶点。之后,我试图通过删除顶点覆盖内具有所有邻居的顶点来减少顶点的数量。

我的问题是如何使顶点覆盖更小?我试着尽可能低。

3 个答案:

答案 0 :(得分:2)

这是一个想法,但我不知道它是否在实践中有所改进:

https://en.wikipedia.org/wiki/Biconnected_component"任何连接的图分解成一个双连通组件树,称为图的块切割树。"此外,您可以在线性时间内计算这种分解。

我建议你结婚并删除两个顶点时,只对同一个双连通组件中的两个顶点执行此操作。当您用完要合并的顶点时,您将拥有一组彼此不相连的树。树上的顶点覆盖问题可以通过动态编程来处理:如果将该节点添加到封面并且该节点未添加到封面,则每个节点计算最佳答案的成本。您可以为给定孩子的最佳答案计算节点的答案。

另一种方式 - 对于我所知道的更好 - 将是计算图的最小生成树并使用动态编程来计算该树的最佳顶点覆盖,忽略树外的链接,从中删除覆盖的链接图表,然后像以前一样通过结合顶点继续。

我认为我更喜欢最小的生成树。在生成最小生成树时,您将删除少量链接。具有N个节点的树具有N-1个链接,因此即使您没有返回原始树,也可以返回具有尽可能多的链接的树。完整图形的顶点覆盖也是最小生成树的顶点覆盖,因此如果完整图形的正确答案具有V顶点,则存在具有最多V个顶点的最小生成树的答案。如果在树中添加了k个随机边,则需要添加k个边(不一定相同)以将最小生成树转换为完整图。您当然可以确保这些新边缘最多覆盖k个顶点。因此,如果最佳答案具有V个顶点,您将获得最多V + k个顶点的答案。

答案 1 :(得分:1)

这里尝试的是一个确切的答案,当只添加少量链接时,或者他们不会非常改变节点间距离时,这些答案是易于处理的。

找到最小生成树,并将边缘划分为"树边缘"并且"添加边缘",其中树边缘形成最小生成树,并且没有为此选择添加的边缘。它们可能不是在施工期间实际添加的边缘,但这并不重要。 N个节点上的所有树都有N-1个边,因此我们在创建过程中使用的边数相同,即使边缘不同也是如此。

现在假装你可以在书的后面偷看答案,只要看到每个添加边的一个顶点,该顶点是否是最佳顶点覆盖的一部分。如果是,您可以从问题中删除该顶点及其链接。如果没有,那么另一个顶点必须是这样你可以从问题中删除它及其链接。

您现在必须为树或多个断开连接的树找到最小顶点覆盖,我们知道如何执行此操作 - 请参阅我的其他答案以获得更多的手工操作。

如果您无法查看书的背面以获得答案,并且有k个添加边,请尝试所有2 ^ k个可能的答案,这些答案可能已经出现在书的后面并找到最佳答案。如果幸运的话,添加的链接A与添加的链接B位于不同的子树中。在这种情况下,您可以将两个可能性所需的两个计算限制为将相关子树的动态编程计算添加到链接A(或B)中。你的工作量只增加了一倍而不是四倍。一般情况下,如果您添加的k个边是k个不同的子树,彼此不会相互干扰,则成本乘以2而不是2 ^ k。

答案 2 :(得分:0)

最小顶点覆盖是NP完全算法​​,这意味着即使对于100个顶点(更不用说50k),你也无法在合理的时间内解决它。

对于树,有一个多项式时间贪婪算法,该算法基于DFS,但事实上你已经添加了#34;随机边缘"拧紧所有东西,使这个算法无用。

Wikipedia has an article about approximation algorithm声称它已达到因子2,并声称没有更好的算法知道,这使得它不太可能找到一个。