查找特定v具有k度的生成树

时间:2017-02-01 08:57:01

标签: 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

3 个答案:

答案 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的度数为XX > k,那么在最坏的情况下,步骤4必须重复XCk(X choose k)次。

答案 2 :(得分:0)

我们也可以这样思考:

  1. 对于所有邻居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中以确保约束成立。

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

  3. 假设小步骤1&amp; 2以O(m * lg(n))运行。