动态编程:简单图形的顶点覆盖

时间:2015-02-17 16:31:09

标签: algorithm graph dynamic-programming

我希望找到一种有效的算法来找到两个特定图形的最小成本顶点覆盖,其中顶点具有不同的成本。

第一个图是一个排序列表,其中我们有V = {1 ... n}和E = {{1,2},{2,3},{3,4} ...... {N-1,N}}

第二张图是一个简单的循环。基本上与上面相同,但{n,1}也是边缘。

通过简单地检查每个节点是否应该在顶点覆盖中,我已经找到了一种递归方式来完成第一个方法。

VC(Graph G(V,E)):
  if(|V|=0) return 0
  u=first node of V
  v=second node of V
  return min(VC(Graph.remove(u)+cost(u),   //Case where the first node is in VC
             VC(Graph.remove(v,u))+cost(v)) //Case where second node is in VC

然而,这真的是效率低下的,有没有办法使用动态编程来改进它?

1 个答案:

答案 0 :(得分:1)

  1. 对于一个链,动态编程解决方案非常简单。州是(number of vertices processed, is the last vertex taken)。州的价值是覆盖图表这一部分的最低成本。

  2. 对于一个循环,我们可以使用以下观察:第一个或第二个顶点在封面中。因此,我们可以通过删除第一个或第二个顶点并选择最佳答案来将其减少到1)问题。

  3. 这两种解决方案都具有线性时间复杂度。

    第1部分的一些伪代码:

    f(1, false) = 0 // do not take the first vertex
    f(1, true) = cost(1) // take it
    for v <- 2 ... n:
        f(v, false) = f(v - 1, true) // do not take the current vertex
        f(v, true) = min(f(v - 1, true), f(v - 1, false)) + cost(v) // take it
    print(min(f(n, false), f(n, true)))