【问题标题】:Min max edge weight tree [closed]最小最大边缘权重树[关闭]
【发布时间】:2019-01-05 13:50:51
【问题描述】:

给定一棵具有 N 个节点和 N-1 个双向边的树,并给定一个整数 S。现在,您必须为这棵树的边分配权重,这样:

1.所有边的权重之和等于S

2.对于树的每个可能的直径,其路径所覆盖的所有边缘的最大权重是最小的。

输出可能的最小重量。

【问题讨论】:

  • 这里没有问题。你只是放弃了你的家庭作业问题,没有表现出任何努力去解决它。

标签: python algorithm tree


【解决方案1】:

方法正确,但算法不正确。

示例:1 - 2 , 1 - 3, 1 - 4, 4 - 5 , 2 是其中一个直径的端点 但是 (2 - 3) 距离和 (2, 5) 不一样

但是在这棵树中,每条边都是直径的一部分。

【讨论】:

  • 感谢测试用例,我试图简化算法,但它显然不能这样工作,所以我恢复了原始版本。
  • 是的,我们可以检查每条边是否是任何直径的一部分,复杂度为 O(n)。对于每条边 (u - v),找到从 u 到远离 v 的任何节点的最大距离,假设为 D1,对于远离 u 的节点 v,假设为 D2,则该边将贡献 (D1 + D2 + 1) ,通过 Dp,我们可以计算出每条边的信息。
【解决方案2】:

基本上,您需要找出是否存在不在直径上的边缘。如果有,则将所有权重分配给该边,因此直径上的最大权重为 0。否则,在边之间均匀分配权重。

您可以做到这一点的一种方法是找到任意直径的中心。每隔一个直径也将通过这个中心。在简单的情况下,直径有偶数个边,您需要从中心点运行 DFS 并检查到所有叶子的距离是否相同。如果是,则返回S/#edges,否则返回0。如果直径有奇数条边,您可以在直径中心边的中间添加虚拟顶点并从它开始。复杂度为O(V+E)

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 2014-10-14
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多