zoukankan      html  css  js  c++  java
  • 关于树的直径

    题解:

    1.树的直径有一种找法是找两次最远点

    于是这可以证明一个性质

    树上一个点到最远点的距离等于到一条直径两个端点的较大值

    2.合并两颗树的时候,新树的直径为两颗树的4个直径两两组合的最大值(有多条取一条就可以)

    3.另一个性质

    树的所有直径一定有一个公共交点

    对于两条,我们很好证,只需要找到他们之间的路径即可反证

    对于两条以上,我们会发现如果如果有多个交点,就构成环了

    例题:

    1.现在要摧毁一些点,使得这棵树分成两棵小树,第一棵小树的直 径为D1,且有不超过C1个点可能在直径的端点,第二棵小树直径为 D 2,且有不超过C 2个点可能在直径的端点.

    n<=200

    题解:

    首先比较显然的是我们要去枚举以哪个点切割成两颗树(如果还有很多儿子就把多的儿子都删了)

    然后就等于变成了一个问题,求一颗子树内满足直径为d,不超过c个点为直径端点

    这个问题看上去并不好解决

    这里有个方法是:去枚举树的中心(树的直径的中心)

    我们考虑,直径对于我们来说,肯定是越短越好,点肯定是删的越少越好

    所以对于枚举的中心点,我们会把到它c/2以内的点保留

    对于大于等于c/2的,我们保留k个就可以了

    然后奇数还要讨论一下

    反正这样被变成码农题了。。

    2.给定一棵 n 个节点的树,你可以进行 n − 1 次操作,每次操作步骤如下: 选择 u, v 两个度数为 1 的节点。 将 u, v 之间的距离加到 ans 上。 将 u 从树上删除。 求一个操作序列使得 ans 最大。

    这个比较容易联想到直径

    进一步我们可以想到一个点到最远点的距离是到直径两端点之一

    于是我们会发现,我们只要先删外面的点,再把直径之间的点逐一删除就行了

    那如果有多条直径呢,我们会发现进行这两个过程是分别等价的

  • 相关阅读:
    51nod 1067 Bash游戏 V2
    洛谷 P1454 圣诞夜的极光 == codevs 1293 送给圣诞夜的极光
    bzoj4754: [Jsoi2016]独特的树叶
    bzoj 4241: 历史研究
    bzoj 1266 [AHOI2006] 上学路线
    bzoj4571: [Scoi2016]美味
    bzoj4570: [Scoi2016]妖怪
    51nod 1238 最小公倍数之和 V3
    一个康托展开的板子
    poweroj1745: 餐巾计划问题
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/10125920.html
Copyright © 2011-2022 走看看