最小生成树中所有节点之间的每条可能路径的距离

时间:2016-11-05 15:26:19

标签: algorithm graph tree

我希望从所有节点获得所有节点的距离。有一些问题,但没有解决我的问题。 我的应用是我正在实现递归DFS并在回溯时存储每个路径的结果,但问题是我的运行时间很长而且我经历了N次路径(N是边数)。 / p>

正如您在我的代码中所看到的,我正在为每个可能的节点运行dfs作为根。我不知道如何在DFS搜索的一次迭代中重用路径来知道答案。

我认为它可以在O(n)中作为最小生成树完成,并且在一对节点之间只有一条路径。

我的代码:

for(i=1;i<=n;i++)
    {
        fill(visited.begin(),visited.end(),0);
        ans=0;
        calc(i,i);
    }

主要:

SELECT MAX(ASAP) as ASAP, RENTALNUMBER, Area, PadNum, Size, Pet
FROM t
GROUP BY RENTALNUMBER, Area, PadNum, Size, Pet;

1 个答案:

答案 0 :(得分:1)

我可以想到使用分而治之的复杂性 O(n * logn)的解决方案。让我分享一下。

让我们选择距离 d 的边缘 e ,这是连接节点 a b 。让我们把它剪掉。现在我们有两棵树,根 a b 。我们假设,

  • 树中的节点数 a = na
  • 树中每个节点之间的距离总和 a 是= ca
  • 树中每个节点到根的距离之和 a 是= ra
  • 树中的节点数 b = nb
  • 树中每个节点之间的距离总和 b 是= cb
  • 树中每个节点到根的距离之和 b 是= rb

因此原始树中每个节点之间的距离为:  ca + cb +(nb * ra + na * d * nb + na * rb))

现在,我们可以使用相同的方法计算树 a b 中每个节点的距离总和。需要注意的一点是,我们必须选择这样的边缘 e ,以使组件数量之间的差异不大。您总是可以在树中找到一条边,如果您剪切该边,则生成的两棵树中的节点数之间的差异将不会超过1.