关于断开图中的所有顶点:算法

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
    21
    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