【问题标题】:How to find weighted minimum vertex cover of graph如何找到图的加权最小顶点覆盖
【发布时间】:2012-08-20 21:29:21
【问题描述】:

所以,我有一个具有特定权重和边的顶点图。我正在尝试找到最小加权顶点覆盖。例如,如果我有一个大小为 10 的顶点覆盖,但每个节点的权重为 10,那么总覆盖的权重为 100。但如果我有一个大小为 99 的顶点覆盖,每个节点的权重为 1,那么我会选择这个封面而不是前一个。

我相信这是 NP-Complete,因此没有有效的算法,但我认为即使是详尽的搜索也对我有用,因为节点的数量会相对较少。我能想到的唯一方法是生成集合 [1 ... n] 的幂集(其中每个整数对应于图上的一个节点),然后测试每个单独的集合以查看它是否是1)一个有效的顶点覆盖,2)跟踪最低权重的顶点覆盖。

但这似乎非常低效。这是最好的方法吗?

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    最小权重顶点覆盖是 NP 完全的,因此一般情况下您不能期望比穷举搜索更好,但您可以使用回溯来找到最小权重顶点覆盖,如下所示:

    MinCover(Graph G, List<Vertex> selectedVertices, int min)
    {
       var coveredAll = covered(G,selectedVertices);
       if ( coveredAll && weight(selectedVertices) < min)
       {
           cover = selectedVertices.ToList();
           min = weight(cover);
       }
       else if (!coveredAll && weight(selectedVertices) < min)
       {
          select another unvisited vertex and add it to selectedVertices
          call MinCover
          remove the previously selected vertex from the list
       }
    
       return;
    
    }
    

    【讨论】:

    • 所以只是为了确认一下,如果选定的顶点是有效的顶点覆盖,covered() 返回 true/false,并且“先前选择的顶点”是上面选择的两行顶点?
    • @ShayonSaleh,是的,学习回溯很高兴看到八皇后,我的回答也是branch and bound
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2021-10-26
    • 2017-08-07
    相关资源
    最近更新 更多