树木边缘切割

时间:2013-04-04 14:54:22

标签: algorithm graph tree graph-algorithm depth-first-search

通过移除其中一条树,可以将树拆分为两个不同的树。给定N个节点由[0, N-1]范围内的整数唯一标识的树,我需要编写一个函数来查找需要从树中删除的边,这样才能得到总和之间的差异结果树中所有节点ID的最小化。

该函数应该打印它在标准输出(stdout)中找到的最小差异。

该函数将收到以下参数:

parent这是一个整数数组,其含义如下:parent[i] =节点i的父节点(更具体地说是其ID)

parent[i] = -1如果我没有父母(我是树的根)

数据限制

树中的最大节点数为50,000

效率限制

该功能可以在不到2秒的时间内打印出结果

示例

 Input parent: [1, 4, 4, 2, -1, 2, 2]

 aka :         4
              / \
             1   2
            /  / | \
           0  3  5  6   

 Output: 9

说明:我们删除了节点2和6之间的边缘。

1 个答案:

答案 0 :(得分:2)

  1. 对于每个节点,计算其子节点的总和,然后将此值添加到自身,并将其存储在节点中。我们将此值S_n称为n,其中n是一个节点。 (可以通过递归和后序遍历轻松完成)

  2. 找到S_nS_root/2最小差异的节点{{1}}。 n与其父级之间的边缘是我们想要的边缘。 (在最坏的情况下,这需要线性时间。)