有人可以帮我解释一下如何解决它我知道我们应该使用DFS,但我不能理解我们之后做了什么。
input : undirected graph G and specific v that belong to the G
output : spanning tree that v has k degree
答案 0 :(得分:2)
我会建议以下方式。 在这里我假设G已连接。 首先从图中删除v,找到每个剩余组件的生成树。
现在您可能有一个生成树或森林,具体取决于图表,您可以添加回v并使用边连接v和每个生成树。
然后你将有一个G的生成树,并且会有三种情况。
案例1 :度v> k,在这种情况下,任务是不可能的
案例2 :度v = k,你有答案。
案例3 :度v <&lt; k,然后你只需添加v的未使用边缘。每次添加边缘都会创建一个循环,然后你可以选择一个不接触v的边缘并将其移除。 你继续添加边缘,直到你的答案或所有边缘用完为止。 但是,除了执行bfs / dfs之外,我无法想到查询循环的快速方法。
更新:在将v连接到k个适当的邻居后,使用Kruskal或Prim的方法可以更快地通过Matt 案例3 算法用于填充生成树的其余部分,从v已经存在的边缘开始。
答案 1 :(得分:0)
这是我提供的一种算法,但它非常暴力。
此树存在的条件:如果degree of v < k
,则此树不存在。
否则遵循算法:
从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 choose k)
次。
答案 2 :(得分:0)
我们也可以这样思考:
对于所有邻居v_i s.t中的给定顶点v。 (v,v_i)在E(G)中选择具有最小权重w(v,v_i)的k个边缘,我们需要O(d * lg(d))时间,其中deg(v)= d> = k。将这些边添加到生成树边集S中。我们必须将这些边添加到S中以确保约束成立。
从图G中删除顶点v以及v上的所有边。现在从图集G \ {v}运行Prim / Kruskal,从边集S开始,算法本身将添加边缘以确保非循环和最小的属性。这将在O(m * lg(n))中运行。
假设小步骤1&amp; 2以O(m * lg(n))运行。