树分裂(基于算法)

时间:2012-07-15 23:49:24

标签: algorithm

这是一家公司提出的编码问题:

  

给定一个树,其中N个节点和权重与每个节点相关联   给出边(存在于树中)。你必须删除一条边   创建的两棵树的权重之和的差异最大。

输入:

  

第一行包含N否。节点第二行包含N个积分   表示每个节点的权重,后跟表示边缘的N-1行   本。

输出:

  

创建的树的权重的最大差异。

示例:

输入:

第一个测试用例:

3
8 7 8
10
21

输出:7

第二个测试用例:

9
5 5 4 1 8 8 3 5 2
10
20
31
41 
53 
60
75
81

输出:13(不确定此输出)

1 个答案:

答案 0 :(得分:2)

如果权重不能为负数,那么最佳解决方案显然是切断一片叶子。假设总树重为 S ,我们可以在 O(n) 中找到它,如下所示:<登记/>
1. ans := 0
2.对于每个顶点 v ans := max ans abs S - 2 * 重量 [ v ]))//剩余部分与叶子之间的差异
3.返回 ans