关于树的直径

题解:

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 最大。

这个比较容易联想到直径

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

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

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

原文地址:https://www.cnblogs.com/yinwuxiao/p/10125920.html