断开图中的所有顶点

我正在寻找一种算法,通过从图中删除该子集(以及连接这些顶点的边)的所有其他顶点变为不连接(即图不会有任何边),找到最小的顶点子集。

  • 有没有这样的算法?
  • 如果不是的话:你能推荐一些启发式来指定顶点。
  • 我有一个图论的基本知识,请原谅任何不正确。


    IIUC,这是经典的最小顶点覆盖问题,不幸的是,NP完成。

    幸运的是,最直观,最贪婪的算法就像在这种情况下一样好。


    贪婪算法是顶点覆盖的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}.
    

    试试这种方式:

  • 定义一个变量来计算顶点数,从0开始;
  • 按照每个顶点的相邻列表的长度排序,创建顶点的Max-Heap;
  • 从堆的第一个顶点(边数最多的顶点)中移除所有边并将其从堆中移除,并将计数加1;
  • 现在重新排列堆的顶点数量,然后重复上一步,直到第一个顶点相邻列表的长度为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
    
  • 链接地址: http://www.djcxy.com/p/12195.html

    上一篇: Disconnect all vertices in a graph

    下一篇: Find repeating substring of Length N