[CTSC2017] 网络
题意简述
给一棵树,添加一条边(连接两个节点),使得新图的直径最小。
分析
- 存在一组最优解,使得添加的边所连接的两个节点 \(a,b\) 都在原树的直径上。证明可参考yhx的博客。(本来是想自己写的,但是怎么写都感觉没这个好)。
- 除了直径上的边外,可能对答案产生贡献的边应当是直径上的点向直径外延伸出的最长链。
- 树中加入一条边,显然可以看作基环树处理,而求基环树的直径又可以形式化为最大化环上两点各自向子树方向的最长链长度之和加上两点在环上的最短路距离。
做法
本题显然是一个最小化最大值的问题,想到二分。
令 \(x\) 为当前要 check 的值,\(L_i\) 表示 \(i\) 到直径左端点的距离,\(ma_i\) 表示 \(i\) 向直径外延伸出的最长长度,\(a,b\) 为添加的边连接的两个节点,\(i,j\) 为我们求基环树直径过程中选择的两个点。
首先确定 check 的思路,应该是判断原先距离大于 \(x\) 的两个点,能否通过走新添加的边让距离小于 \(x\)。
即判断对于所有 \(i,j\) 满足 \(L_j-L_i+ma_i+ma_j>x\),是否有 \(\left |L_a-L_i\right |+\left |L_b-L_j\right |+ma_i+ma_j+c \le x\)。
绝对值很难处理,考虑拆开,变为:
\(L_i+L_j+ma_i+ma_j+c−x≤L_a+L_b\)
\(L_i−L_j+ma_i+ma_j+c−x≤L_a−L_b\)
\(-L_i+L_j+ma_i+ma_j+c−x≤-L_a+L_b\)
\(−L_i−L_j+ma_i+ma_j+c−x≤−L_a−L_b\)
题目最终变为判断是否存在 \(a,b\),同时满足上述四个条件,维护四个指针,判断区间的交集即可。

浙公网安备 33010602011771号