【问题标题】:IOI 2003 : how to calculate the node that has the minimum balance in a tree?IOI 2003:如何计算树中余额最小的节点?
【发布时间】:2015-01-22 06:12:36
【问题描述】:

这里是Balancing Act 问题,要求在树中找到具有最小余额的节点。余额定义为:

删除任何节点 从树中产生一个森林:一棵或多棵树的集合。将节点的 balance 定义为森林 T 中通过从 T 中删除该节点而创建的最大树的大小

对于示例树,例如:

2 6
1 2
1 4
4 5
3 7
3 1

解释是:

删除节点 4 会生成两棵树,其成员节点为 {5} 和 {1,2,3,6,7}。这 这两棵树中较大的有五个节点,因此节点 4 的余额为 5。删除节点 1 生成由三棵大小相等的树组成的森林:{2,6}、{3,7} 和 {4,5}。这些树中的每一棵 有两个节点,所以节点1的余额是两个。

你能为这个问题提供什么样的算法?

谢谢

【问题讨论】:

  • 家庭作业? ...这只是一棵普通的树吗?或者你能自己种树吗?
  • @yochai 这不是家庭作业。我不是学生,只是想解决这个问题。树的给出就像来自 x -> y 的输入

标签: algorithm graph tree


【解决方案1】:

我假设您已经仔细研究过这个问题:阅读解决方案无济于事,您只有通过自己解决这些问题才能更好地解决这些问题

所以要观察的一件事是,输入是一棵树。这意味着每条边将 2 棵较小的树连接在一起。删除一条边会产生 2 棵不连贯的树(2 棵树的森林)。

所以,如果你在边的一侧计算树的大小,然后在另一侧,你应该能够查看节点的边并问“另一侧的树的大小是多少这个边缘?”

您可以使用动态编程计算树的大小 - 您的重复状态是“我在哪边?我在哪一边?”并计算在该节点“挂起”的树的大小。这就是问题的症结所在。

有了这些数据,遍历所有节点就足够了,查看它们的边缘并询问“该边缘另一侧的树的大小是多少?”从那里,您只需选择最小值。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    你基本上想为每个节点检查 3 件事:

    1. 其左子树的大小。
    2. 其右子树的大小。
    3. 树的其余部分的大小。 (树的大小 - 左 - 右)

    您可以使用此算法并将其扩展到任何类型的树(不同数量的子节点)。

    in-order sequence 中遍历树。

    递归执行:

    每次从节点备份到“父”节点之前,您需要将节点的总子树的 1+size 添加到“父”节点。
    然后存储一个值,我们称之为 ma​​xTree,在它的所有子树之间拥有最大值的节点中,以及(所有子树的总和)-(树的大小)。

    这样您可以计算所有子树的大小 O(N)
    在遍历树时,您可以保存一个变量来保存目前找到的最小值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多