【问题标题】:Edge cutting in Trees树木边缘切割
【发布时间】:2013-04-04 14:54:22
【问题描述】:

一棵树可以通过删除其中一条边分成两棵不同的树。给定一棵具有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 之间的边。

【问题讨论】:

  • 你能详细说明你卡在哪里了吗?你有任何开始使用的代码吗?

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


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

  2. 找到n 与S_n 与S_root/2 的差异最小的节点。 n 和它的父节点之间的边就是我们想要的边。 (这在最坏的情况下需要线性时间。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多