寻找树上的最大重量

时间:2016-04-18 07:25:10

标签: algorithm tree

我有一个N个节点的树,每个边都有一些重量。对于所有对(u,v) 1<=u<=N 1<=V<=N,我必须找到从UV的路径中的最大权重。如何找到每对(U,V)的最大权重总和?

3 个答案:

答案 0 :(得分:0)

您可以使用Floyd Warshall算法。你可以用(-1)乘以每个边,并解决你的问题,比如找到所有对之间的最短路径,然后将你的结果乘以(-1)。

答案 1 :(得分:0)

对于每个节点,您可以将其扩展到树。对于每个边x,节点(x, y)的扩展过程如果是value[x] > value[y],那么我们转到节点y并继续该过程,因此扩展节点{{ 1}}是一棵树,x的值是最大的。

树的某些值有可能是最大的,为了打破平局,我们可以为每个节点分配一个索引,使值像一对x,每个(value[x], idx[x])是不同。

然后对于每个扩展树,假设具有最大值的节点为idx,将其作为根,假设它具有x子树,每个子节点具有总节点号m,则来自不同子树的两个节点之间的每条路径都具有最大权重num[i],因此value[x]计算value[x]次,即。{ SUM[num[i]*num[j]] (i != j),我们错过了从节点(SUM[num[i]]^2-SUM[num[i]^2])/2开始的路径,因此我们还应该多计算x次。在扩展过程中可以生成SUM[num[i]]

这是O(n ^ 2)解决方案。而且我相信还有其他更快的算法。

答案 2 :(得分:0)

给定一个树T,让S(T)成为你感兴趣的总和:它们之间路径中最大边缘权重的每对顶点的总和。

如果T没有边,则它有1个顶点,S(T)= 0。

否则,考虑树中最大的边E,并说它的权重为W.如果从树中删除此边,最终会得到两个较小的树(称为T1和T2)。假设T1是边缘上方的树(即包含T的根的子树)。

如果u在T1中且v在T2中,则它们之间的任何路径中的最大边缘经过E,其具有权重W并且保证是路径中的最大权重。否则,如果u和v都在T1中,则它们之间的路径保持在T1内。 T2相同。

因此S(T)= 2 * W * v(T1)* v(T2)+ S(T1)+ S(T2)。 (其中v(T)表示T)的顶点数。

这为您提供了计算S(T)的递归公式,唯一的困难是在子问题中快速找到最大边缘。

一种方法是在树的每个顶点存储该顶点下方任何边的最大权重。然后你可以在O(log(v(T))时间内找到整棵树中最大的权重,当你按照上面的算法去掉那个最大的权重时,你可以修补上面树上部分的权重log(v(T1))时间的边缘.T2中的权重不需要调整。

总的来说,这给你一个O(v(T)log(v(T)))算法。每个边缘只删除一次,每步最多只有O(log(v(T)))。