所以,我有一个顶点图,它有一定的权重和边。我正试图找到最小加权顶点覆盖。例如,如果我有一个大小为10的顶点覆盖但每个节点的权重为10,那么总覆盖的权重为100.但是如果我有一个大小为99的顶点覆盖,每个节点的权重为1,那么我会选择上一封的封面。
这是NP-Complete我相信,所以没有有效的算法,但我认为即使是详尽的搜索对我也有用,因为节点数量相对较少。我能想到的唯一方法就是生成集合[1 ... n]的幂集(其中每个整数对应图上的一个节点),然后测试每个单独的集合以查看它是否是1)有效的顶点覆盖,2)跟踪最低权重的顶点覆盖。
但这似乎非常低效。这是最好的方式吗?
答案 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;
}