Disconnect all vertices in a graph - Algorithm
我正在寻找一种算法,它可以找到顶点的最小子集,这样,通过从图中删除这个子集(以及连接这些顶点的边),所有其他顶点都会变得不连接(即,图不会有任何边)。
- 有这样的算法吗?
- 如果不是:你能推荐一些启发式方法来指定顶点吗?
我对图论有基本的了解,所以请原谅任何不正确的地方。
IIUC,这是经典的最小顶点覆盖问题,不幸的是,NP完全。
幸运的是,在这种情况下,最直观、最贪婪的算法是最好的。
贪婪算法是一种顶点覆盖的2-近似算法,理论上,在唯一的博弈假设下,它是最好的。在实践中,将顶点覆盖的公式作为一个整数程序求解,很可能会得到更好的结果。程序是
1 2 3 4 | 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}. |
尝试这种方式:
- 定义一个变量来计算顶点数,从0开始;
- 根据每个顶点的相邻列表的长度创建顶点的最大堆;
- 从堆的第一个顶点(边数最大的顶点)中删除所有边,然后从堆中删除边,将1添加到计数中;
重新排序堆,现在顶点的边数已更改,重复上一步,直到第一个顶点的相邻列表长度为0;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Heap 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