[APIO2010] 巡逻
Description
Solution
首先,只要大家认真看题,都会发现一个极其重要的条件:
1 ≤ k ≤ 2 1\le k\le 2 1≤k≤2
因此我们需要先分类讨论 k k k 的取值。
Subtask 1
这种做法其实非常容易想到,在加了一条边之后,这棵树就变成了一棵基环树。如何使这条边减少的费用最多呢?
自然是找树上距离最长的两点(也就是树的直径),并在它们之间加一条边,答案即为 2 × ( n − 1 ) − a n s + 1 2 \times (n-1)-{\rm ans}+1 2×(n−1)−ans+1。
那如何才能求树的直径呢?
两种方法:
两次 BFS / 树形 DP
-
两次 BFS 求树的直径的步骤:
- 从任意一点 A A A 出发,找到与该点距离最长的一个点 B B B,
- 从点 B B B 出发,找到与点 B B B 距离最长的点 C C C ,
- 线段 B C BC BC 即为所求。
证明如下:
假设 B B B 不是直径的一个端点, C D CD CD 为树的直径。
① 当点 A A A 是直径上的点时:如图,
∵ A B > A D , \because AB>AD, ∵AB>AD,
∴ A C + A B > A C + A D , \therefore AC+AB>AC+AD, ∴AC+AB>AC+AD,
∴ A C + A B > C D . \therefore AC+AB>CD. ∴AC+AB>CD.
这与 C D CD CD 是树的直径矛盾。
② 当点 A A A 不是直径上的点且 A B AB AB 与 C D CD CD 间有公共结点 E E E 时:
如图,
∵ A E + E B > A E + E D , \because AE+EB>AE+ED, ∵AE+EB>AE+ED,
∴ E B > E D . \therefore EB>ED. ∴EB>ED.
∴ C E + E B > C E + E D , \therefore CE+EB>CE+ED, ∴CE+EB>CE