我想编写一个算法,在线性时间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;
}
}
}
}
我认为它的时间复杂度是
(| V_i |,| E_i |分别是我们称之为DFS的子树的顶点和边的数量)
我找到的时间复杂度是对的吗?或者我计算错了?
编辑:重现关系描述算法的复杂性:
T(| V |)= E * T(| V | -1)+ O(1)
?或者我错了吗?