断开图中的所有顶点 - 算法

时间:2015-06-23 12:15:56

标签: algorithm graph

我正在寻找一种找到最小顶点子集的算法,这样通过从图中移除这个子集(和连接这些顶点的边),所有其他顶点都变得不连接(即图形不会有任何边缘)。 / p>

  • 有这样的算法吗?
  • 如果不是:您能否推荐某种启发式方法来指定顶点。

我对图论有基本了解,所以请原谅任何不正确之处。

3 个答案:

答案 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开始;
  • 创建按每个顶点的相邻列表的长度排序的顶点的Max-Heap;
  • 从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