1 条题解
-
0
题解:加边后最小化直径
问题转化
给定一棵 个节点的树(边权为正),需要加一条长度为 的边(连接任意两个节点)。
新图的直径定义为任意两点最短路的最大值。
要求选择加边的两个端点,使得新图的直径最小,输出这个最小直径。关键观察
1. 加边对路径的影响
设加的边连接 和 ,边权为 。
$$\min(\text{dist}_T(x,y),\ \text{dist}_T(x,u)+L+\text{dist}_T(v,y),\ \text{dist}_T(x,v)+L+\text{dist}_T(u,y)) $$
新图中任意两点 的最短路为:其中 表示树上的距离。
2. 直径候选
新图的直径可能来自:
- 原树的直径(不加这条边时已经最大)
- 经过新边的某条路径
设原树直径为 ,则新图直径至少为 (因为加边不会使原来最远的点对变近)。
但加边后可能产生更长的路径,所以我们要最小化的是 。3. 经过新边的最长路径
考虑新边连接 ,经过新边的最长路径为:
$$\max_{x} \text{dist}_T(x,u) + L + \max_{y} \text{dist}_T(v,y) $$但 和 可以相同,所以实际上是:
$$\max_{x,y} [\text{dist}_T(x,u) + L + \text{dist}_T(v,y)] $$这等于:
其中 是 到最远点的距离(即 的偏心距)。
所以经过新边的最长路径为 ,其中 表示 的偏心距。
4. 问题简化
我们需要选择 ,使得:
最小。
令 ,则答案为 。
但注意 是加边的两个端点, 的最小值可能小于 ,此时答案就是 。
实际上,我们是要最小化:
$$\min_{u,v} \max(D,\ \text{ecc}(u)+L+\text{ecc}(v)) $$这等价于:找到最小的 ,使得存在 满足 且 。
因为 是固定的,所以 。
问题变为:是否存在 使得 。5. 二分答案
二分最终的直径 ,检查是否存在 使得:
- (保证经过新边的路径不超过 )
- 并且原树中所有点对距离不超过 (这一条自动满足,因为 )
所以只需检查条件1。
6. 检查方法
对于给定的 ,需要判断是否存在 使得 。
这相当于在偏心距数组 中找两个数,它们的和不超过 。
可以排序 数组,然后用双指针检查。时间复杂度 。
但需要 预处理所有点的偏心距。
7. 计算偏心距
偏心距 。
可以通过两次 DFS 求出树的直径端点 ,然后对于任意点 :
$$\text{ecc}(u) = \max(\text{dist}(u,p),\ \text{dist}(u,q)) $$证明:树的直径端点一定包含离 最远的点之一。
所以:
- DFS 从任意点(如1)找到最远点
- DFS 从 找到最远点 ,同时记录
- DFS 从 记录
8. 算法步骤
- 读入 ,若 结束
- 读入树,建立邻接表
- 求直径端点 ,并计算
- 计算 (即直径长度)
- 计算
- 对 数组排序
- 二分答案 ,下界 ,上界 (因为加边最多使直径增加 )
对于每个 :
- 若 ,则不可能,需要增大
- 否则检查是否存在 使得 用双指针:固定 ,找最大的 使得和 ,由于数组已排序,只需 扫描
- 输出最小的满足条件的
9. 时间复杂度
- 预处理:
- 排序:
- 二分: 总复杂度 ,可过 。
10. 注意事项
- 多组数据,注意清空数组
- 边权可能很大,用
long long - 二分上界可以设为 ,但更安全地设为
- 检查时注意 可以是同一个点吗?加边需要两个不同端点,所以
11. 检查优化
对于每个 ,检查是否存在两个不同点的偏心距和 :
- 排序后,设
- 若 ,则无解(因为最小的两个和已经大于 )
- 否则,用双指针从两端向中间扫描: 若 ,则存在解(取 和 对应的点) 否则 --
实际上因为要 ,且两点不同即可,可以直接检查最小的两个和是否 ,因为如果最小的两个和都大于 ,其他组合更大。
但需要确保这两个点不同,如果 则不行(但 ,加边需要两个点,所以 )。所以检查可以简化为:若 ,则有解。
但这是充分条件吗?考虑我们要找两个点 ,它们的偏心距和 ,排序后最小的两个和确实是所有组合中最小的,所以如果它俩和大于 ,其他组合更大,无解。
因此检查是 的。
12. 最终算法
- 预处理 数组
- 排序
- 二分 从 到
- 检查
- 输出最小
但注意: 和 可能对应同一个点吗?不会,因为它们是不同点的偏心距。
13. 边界情况
- :加边长度为0,相当于不加边,答案
- 树是一条链:加边可以缩短某些距离,但直径可能不变
- :只有一条边,加边后成环
总结
算法核心:
- 求树的直径 和每个点的偏心距
- 排序
- 二分答案 ,检查
- 输出
- 1
信息
- ID
- 6075
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者