关于树的直径
题解:
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 最大。
这个比较容易联想到直径
进一步我们可以想到一个点到最远点的距离是到直径两端点之一
于是我们会发现,我们只要先删外面的点,再把直径之间的点逐一删除就行了
那如果有多条直径呢,我们会发现进行这两个过程是分别等价的