修改后的dfs算法的时间复杂度

时间:2015-04-25 23:29:12

标签: graph time-complexity depth-first-search

我想编写一个算法,在线性时间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;
             }
          }
      }
    }

我认为它的时间复杂度是

enter image description here

(| V_i |,| E_i |分别是我们称之为DFS的子树的顶点和边的数量)

我找到的时间复杂度是对的吗?或者我计算错了?

编辑:重现关系描述算法的复杂性:

T(| V |)= E * T(| V | -1)+ O(1)

?或者我错了吗?

0 个答案:

没有答案