Graph 改进dfs算法的时间复杂度

Graph 改进dfs算法的时间复杂度,graph,time-complexity,depth-first-search,Graph,Time Complexity,Depth First Search,我想写一个算法,在线性时间O(n)内找到树的最优顶点覆盖,其中n是树的顶点数 图G=(V,E)的顶点覆盖是V的子集W,使得对于E中的每一条边(A,b),A在W中或b在W中 在顶点覆盖中,每条边至少需要一个顶点 如果我们选择一片非叶子,它可以覆盖多个边缘 这就是为什么我认为我们可以这样做: 我们拜访树根,然后拜访它的一个孩子,我们拜访了后者的一个孩子,依此类推 然后,如果我们已经到达一片叶子,我们会检查我们是否已经获得了它的父顶点覆盖,如果没有,我们会选择它。然后,如果我们为最佳顶点覆盖选择的顶点

我想写一个算法,在线性时间O(n)内找到树的最优顶点覆盖,其中n是树的顶点数

图G=(V,E)的顶点覆盖是V的子集W,使得对于E中的每一条边(A,b),A在W中或b在W中

在顶点覆盖中,每条边至少需要一个顶点

如果我们选择一片非叶子,它可以覆盖多个边缘

这就是为什么我认为我们可以这样做:

我们拜访树根,然后拜访它的一个孩子,我们拜访了后者的一个孩子,依此类推

然后,如果我们已经到达一片叶子,我们会检查我们是否已经获得了它的父顶点覆盖,如果没有,我们会选择它。然后,如果我们为最佳顶点覆盖选择的顶点也有其他子节点,我们会选择第一个子节点并递归访问最左边的子节点,如果我们到达叶子,而它的父节点没有被选择为所需的顶点覆盖,我们会选择它,依此类推

我编写了以下算法:

   DFS(node x){
      discovered[x]=1;
      for each (v in Adj(x)){
          if discovered[v]==0{
             DFS(v);
             if (v->taken==0){
                 x<-taken=1;
             }
          }
      }
    }
DFS(节点x){
发现的[x]=1;
每个(v在形容词(x)中){
如果发现[v]==0{
DFS(v);
如果(v->take==0){

xVertex cover是一个NP完全问题。我希望你意识到你的算法只适用于一棵树。而且,既然它是一棵树,你就不能为顶点cover选择偶数和奇数深度吗?有没有任何情况不是最优的?@BenjaminGruenbaum所以如果树的高度是奇数,我们会为顶点选择偶数深度的顶点最佳顶点覆盖,如果树的高度为偶数,我们选择奇数深度的顶点?@evdina您选择偶数深度顶点数和奇数深度顶点数之间的较低值,这取决于可能是
O(1)的数据布局
solution.@BenjaminGruenbaum那么这是否意味着我们必须查找给定树的高度,如果这是奇数,则偶数深度顶点的数量较少,如果高度为偶数,则偶数深度顶点的数量与奇数深度顶点的数量相同?