如何找到图的加权最小顶点覆盖

时间:2012-08-20 21:29:21

标签: algorithm graph

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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;

}