在未加权图中找到最小顶点数

Posted

技术标签:

【中文标题】在未加权图中找到最小顶点数【英文标题】:find minimum number of vertices in unweighted graph 【发布时间】:2009-08-20 11:37:08 【问题描述】:

我有一个无向加权连接图。如果我选择一个顶点,我会自动选择与它直接连接的所有顶点。什么是算法,以便我能够使用最少的尝试次数选择图形的所有顶点?在每次尝试中,我选择一个顶点。例如对于邻接矩阵 a[][]=1,1,0,0,0, 1,1,1,1,0 ,0,1,1,0,0 0,1,0,1,1 0,0,0,1,1 我必须选择顶点 2 和 4 或顶点 2 和 5。

【问题讨论】:

如果你在 n 个顶点上绘制折线图,​​你必须选择 n/2 个顶点,所以在最坏的情况下,你有 O(n) 个随机图的选择。您对图表有任何先验知识吗? @usersmarvin 但我需要它以最少的选择数量。 @koning any。 在图上不做任何假设,就没有通用的解决方案。任何给定的策略都会在随机图上失败。 usersmarvin,当然有一个总是有效的策略:“枚举所有可能的顶点选择,选择满足条件的最小的那个。”你的意思是没有多项式时间通用解决方案吗? redtuna,当然你是对的。我的意思是,对于任何尝试简单地选择顶点的策略,你都会在一个不好的例子中选择它们 【参考方案1】:

正如red tuna 已经指出的,这是vertex cover 问题的一种。具体来说,这是一个dominating set 问题,主要区别在于支配集可以比正确的顶点覆盖小得多。

您可以将其建模为set cover problem。每个顶点都表示为一个包含自身和所有相邻顶点的子集。如果您不需要保证精确的最优解(只是一个非常好的解),则可以应用greedy set cover heuristic 在 lg n 时间内实现对最优集的逼近。 p>

【讨论】:

【参考方案2】:

这似乎等同于vertex cover 问题。这是NP完全。***建议的算法之一是:

“一种有效的算法技术 这里称为有界搜索树 算法,其思想是 反复选择一些顶点和 递归分支,有两种情况 每一步:放置当前 顶点或其所有邻居进入 顶点覆盖。”

编辑

这是一个证明解决顶点覆盖将解决您的问题的证据,前提是没有没有边的顶点:

(*) 顶点覆盖的解决方案也解决了你的问题

对于每条边,至少有一个端点被顶点覆盖选择。如果至少有一条边连接到每个顶点,则所有顶点最终都会被选中(直接选择或通过直接选择的顶点相邻),从而解决问题。

注意,反过来不成立:

(*) 解决您的问题不一定解决顶点覆盖问题。

考虑这个图表:

[ ] - - - [X] ¦ ¦ ¦ ¦ [ ] - - - [X]

直接选择的节点标有“X”。该图解决了您的问题,但没有覆盖最左边的边缘(因此这不是顶点覆盖解决方案)。

【讨论】:

感谢您的回复。但我确定这不是 np 完整的。 不客气!我很好奇你是如何知道它不是 NP 完全的:Ire-and-curses 指出这正是支配集问题,***通过减少到顶点覆盖表明支配集问题是 NP 完全的.它确实允许一些例外情况,例如,如果您知道封面会很小(或恒定大小,甚至更好)。不过,在一般情况下,在我看来,这个问题确实是 NP-Complete。 我没有任何证据。这个问题是一个编码竞赛练习问题,管理员告诉它不是 np 完整的。这是链接..codechef.com/problems/MMADNESS。我想获得一些关于如何解决问题的线索,我会尝试解决它。​​ 鉴于您最多有 26 台机器和 100 个链接,蛮力可能会很好地工作。试试我上面建议的有界搜索。或者您可以尝试枚举 n 个选定节点的所有选择,以增加 n 的值,直到找到令人满意的分配。 那么,我们信任谁?复杂性理论书籍大军指出 Vertex Cover 在 NP 或 codechef.com 中?

以上是关于在未加权图中找到最小顶点数的主要内容,如果未能解决你的问题,请参考以下文章

java 用于在未加权的二分图中找到最大匹配的匈牙利算法的Java实现

图论的一些知识点

以最小成本断开无向加权图中的两个节点

使用 Boost 的图 breadth_first_search() 在未加权、无向图中查找路径

在加权图中找到最短路径

最小生成树2