我正在寻找一种找到最小顶点子集的算法,这样通过从图中移除这个子集(和连接这些顶点的边),所有其他顶点都变得不连接(即图形不会有任何边缘)。 / p>
我对图论有基本了解,所以请原谅任何不正确之处。
答案 0 :(得分:8)
IIUC,这是经典的Minimum Vertex Cover问题,不幸的是,NP Complete。
幸运的是,most intuitive and greedy possible algorithm和这种情况一样好。
答案 1 :(得分:2)
贪婪算法是顶点覆盖的2近似,在理论上 ,在独特的游戏猜想下,它就像它获得的一样好。在实践中,将顶点覆盖的公式求解为整数程序最有可能产生更好的结果。该计划
min sum_{v in V} x(v)
s.t.
forall {u, v} in E, x(u) + x(v) >= 1
forall v in V, x(v) in {0, 1}.
答案 2 :(得分:0)
尝试这种方式:
当顶点的边数变化时重新排序堆,重复上一步,直到第一个顶点的相邻列表的长度为0;
Heap Q
int count = 0
while(1){
Q = Create_Heap(G)
Vertex first = Q.pop
if(first.adjacents.size() == 0) {
break
}
for( Vertex v : first.adjacent ){
RemoveEdge(first, v)
RemoveEdge(v, first) /* depends on the implementation */
}
count = count + 1
}
return count