Algorithm IOI2003:如何计算树中具有最小余额的节点?

Algorithm IOI2003:如何计算树中具有最小余额的节点?,algorithm,graph,tree,Algorithm,Graph,Tree,这是一个需要在树中找到平衡最小的节点的问题。余额定义为: 删除任何节点 从树中产生一个森林:一个或多个树的集合。将节点的平衡定义为通过从T中删除该节点而创建的林T中最大树的大小 对于示例树,如: 261214453731 解释如下: 删除节点4会产生两棵树,其成员节点为{5}和{1,2,3,6,7}。这个 这两棵树中较大的树有五个节点,因此节点4的余额为五。删除节点 1产生一个由三棵大小相等的树组成的森林:{2,6}、{3,7}和{4,5}。每棵树 有两个节点,因此节点1的余额为两个 你能为这个

这是一个需要在树中找到平衡最小的节点的问题。余额定义为:

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

对于示例树,如:

26
12
14
45
37
31

解释如下:

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

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


谢谢

我假设您已经仔细研究了这个问题:阅读解决方案没有帮助,您只能通过自己解决问题来更好地解决这些问题

所以要观察的一件事是,输入是一棵树。这意味着每条边将两棵较小的树连接在一起。删除一条边将生成两棵断开连接的树(由两棵树组成的森林)

因此,如果计算边一侧的树的大小,然后计算另一侧的树的大小,则应该能够查看节点的边并询问“此边另一侧的树的大小是多少?”

您可以使用动态规划计算树的大小-您的循环状态是“我在哪边?我在哪边?”并计算树在该节点上“挂起”的大小。这是问题的症结所在

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


希望这会有所帮助。

我假设您已经仔细研究了这个问题:阅读解决方案没有帮助,您只能通过自己解决问题来更好地解决这些问题

所以要观察的一件事是,输入是一棵树。这意味着每条边将两棵较小的树连接在一起。删除一条边将生成两棵断开连接的树(由两棵树组成的森林)

因此,如果计算边一侧的树的大小,然后计算另一侧的树的大小,则应该能够查看节点的边并询问“此边另一侧的树的大小是多少?”

您可以使用动态规划计算树的大小-您的循环状态是“我在哪边?我在哪边?”并计算树在该节点上“挂起”的大小。这是问题的症结所在

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


希望能有所帮助。

您基本上希望为每个节点检查3件事:

  • 其左子树的大小
  • 其右子树的大小
  • 树的其余部分的大小。(树的大小-左-右)
  • 您可以使用此算法并将其扩展到任何类型的树(不同数量的子节点)

    用一只手翻过那棵树

    以递归方式执行此操作:

    每次从节点备份到“父”节点之前,您都需要将节点的总子树的1+大小添加到“父”节点。
    然后在节点中存储一个值,我们称之为maxTree,该节点在其所有子树和(所有子树的总和)-(树的大小)之间保持最大值

    这样,您可以计算O(N)中的所有子树大小

    在遍历树时,您可以保存一个变量,该变量保存到目前为止找到的最小值。

    您基本上希望为每个节点检查三件事:

  • 其左子树的大小
  • 其右子树的大小
  • 树的其余部分的大小。(树的大小-左-右)
  • 您可以使用此算法并将其扩展到任何类型的树(不同数量的子节点)

    用一只手翻过那棵树

    以递归方式执行此操作:

    每次从节点备份到“父”节点之前,您都需要将节点的总子树的1+大小添加到“父”节点。
    然后在节点中存储一个值,我们称之为maxTree,该节点在其所有子树和(所有子树的总和)-(树的大小)之间保持最大值

    这样,您可以计算O(N)中的所有子树大小

    在遍历树时,可以保存一个变量,该变量保存到目前为止找到的最小值。

    。。。这只是一棵普通的树吗?或者你能自己做一棵树吗?yochai这不是家庭作业。我不是学生,只是想解决这个问题。树就像x->Y家庭作业的输入一样给出。。。这只是一棵普通的树吗?或者你能自己做一棵树吗?yochai这不是家庭作业。我不是学生,只是想解决这个问题。树的输入方式与x->y的输入方式相同