Algorithm 找到特定v有k度的生成树

Algorithm 找到特定v有k度的生成树,algorithm,depth-first-search,Algorithm,Depth First Search,有人能给我解释一下如何解决这个问题吗?我知道我们应该使用DFS,但我不明白在那之后我们会做什么 input : undirected graph G and specific v that belong to the G output : spanning tree that v has k degree 这是我提供的一个算法,但它非常强大 该树存在的条件:如果vk,那么在最坏的情况下,步骤4必须重复XCk(X选择k)次。我将建议以下方法。 这里我假设G是连通的。 首先从图中删除v,找到其余每

有人能给我解释一下如何解决这个问题吗?我知道我们应该使用DFS,但我不明白在那之后我们会做什么

input : undirected graph G and specific v that belong to the G
output : spanning tree that v has k degree

这是我提供的一个算法,但它非常强大

该树存在的条件:如果v
度,则该树不存在

否则,请按照以下算法进行操作:

从v的所有相邻顶点中拾取k个顶点

1.mark all adjacent vertices of v as VISITED.

2.From each of those adjacent vertices , call DFS and the spanning tree grows.

3.After all DFS is complete,if all vertices of graph G are marked VISITED, then we
have our spanning tree, if a single vertex or more are left UNVISITED, then the 
4.pick another set of k vertices.

如果
v
X
作为度和
X>k
,那么在最坏的情况下,步骤4必须重复
XCk(X选择k)
次。

我将建议以下方法。 这里我假设G是连通的。 首先从图中删除v,找到其余每个组件的生成树

现在,您可能有一个生成树或一个林,这取决于图,您可以添加回v并使用边连接v和每个生成树

然后你会有一个G的生成树,有三种情况

案例1:度v>k,在这种情况下,任务不可能完成

案例2:度v=k,你有答案

情况3:度v
更新:Matt的案例3有一种更快的方法,在将v连接到k个适当的邻居之后,使用Kruskal或Prim的算法填充生成树的其余部分,从你已经拥有的v的边开始。

我们也可以这样想:

  • 对于E(G)中所有相邻v_i s.t.(v,v_i)中的给定顶点v,我们需要O(d*lg(d))时间,其中deg(v)=d>=k。将这些边添加到生成树边集S。无论如何,我们必须将这些边添加到S,以确保约束保持不变

  • 从图G中删除顶点v以及与v关联的所有边。现在在图G\{v}上运行Prim/Kruskal,从边集S开始,算法本身将添加边,确保非循环和最小属性。这将在O(m*lg(n))中运行


  • 假设d小步1和2在O(m*lg(n))中运行。

    这是你不理解的练习陈述还是如何解决它?不,我今天有考试,旧考试中的这个问题我看不懂答案,因为手写很糟糕,我知道你必须运行dfs,如果d(v)>k您需要用后缘或类似的东西替换树边,我无法完全理解所写的内容:(.如果deg(v)>k会发生什么?此外,如果来自v的邻居的df接收到v的另一个邻居,那么该邻居将不会对deg(v)作出贡献)在最后一个MST.case 3中:在将
    v
    连接到k个适当的邻居之后,使用Kruskal或Prim的算法填充生成树的其余部分,从你已经拥有的
    v
    的边开始。实际上没有人说它应该是最小生成树,我假设它是最小的,尽管最小生成树也是最小的生成树,但问题应该更容易解决。