【题解】P3629 [APIO2010] 巡逻(树的直径)
D e s c r i p t i o n \rm Description Description
在一个地区中有 n 个村庄,编号为 1 , 2 , . . . , n 1, 2, ..., n 1,2,...,n 。有 n – 1 n – 1 n–1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其他任一个村庄。每条道路的长度均为 1 1 1 个单位。为保证该地区的安全,巡警车每天要到所有的道路上巡逻。警察局设在编号为 1 1 1 的村庄里,每天巡警车总是从警察局出发,最终又回到警察局。下图表示一个有 8 8 8 个村庄的地区,其中村庄用圆表示(其中村庄 1 1 1 用黑色的圆表示),道路是连接这些圆的线段。为了遍历所有的道路,巡警车需要走的距离为 14 14 14 个单位,每条道路都需要经过两次。
为了减少总的巡逻距离,该地区准备在这些村庄之间建立 K K K 条新的道路,每条新道路可以连接任意两个村庄。两条新道路可以在同一个村庄会合或结束 (见下面的图例 ( c ) (c) (c) )。 一条新道路甚至可以是一个环,即,其两端连接到同一 个村庄。由于资金有限, K K K 只能是 1 1 1 或 2 2 2。同时,为了不浪费资金,每天巡警车必须经过新建的道路正好一次。下图给出了一些建立新道路的例子:
在(a)中,新建了一条道路,总的距离是 11 11 11。在 ( b ) (b) (b) 中,新建了两条道路,总的巡逻距离是 10 10 10。在 ( c ) (c) (c) 中新建了两条道路,但由于巡警车要经过每条新道路正好一次,总的距离变为了 15 15 15。 试编写一个程序,读取村庄间道路的信息和需要新建的道路数,计算出最佳的新建道路的方案使得总的巡逻距离最小,并输出这个最小的巡逻距离。
输入格式
第一行包含两个整 n , K ( 1 ≤ K ≤ 2 ) n, K(1 ≤ K ≤ 2) n,K(1≤K≤2)。接下来 n – 1 n – 1 n–1 行,每行两个整数 a , b a, b a,b, 表示村庄 a a a 与 b b b 之间有一条道路 ( 1 ≤ a , b ≤ n ) (1 ≤ a, b ≤ n) (1≤a,b≤n)。
输出格式
输出一个整数,表示新建了 K K K 条道路后能达到的最小巡逻距离。
100 100 100%的数据中, 3 ≤ n ≤ 100 , 000 , 1 ≤ K ≤ 2 3 ≤ n ≤ 100,000, 1 ≤ K ≤ 2 3≤n≤100,000,1≤K≤2。
S o l u t i o n \rm Solution Solution
一个较为重要的限制条件:
1 ≤ K ≤ 2 1 ≤ K ≤ 2 1≤K≤2
分两类讨论
p a r t part part 1 : 1: 1: K = 1 K=1 K=1
不建立新边的时,要从节点 1 1 1 开始,至少遍历树上每条边一次再回到节点 1 1 1 ,恰好遍历了每一条边两次,路线长度为 2 ( n − 1 ) 2(n-1) 2(n−1) 。
新建一条边 ( x , y ) (x,y) (x,y) 后,树上的一条路径变成环,从节点 1 1 1 遍历至节点 x x x 后,不需回到 1 1 1 节点再遍历至 y y y 节点,而可以直接在节点 x x x 从边 ( x , y ) (x,y) (x,y) 经过至节点 y y y ,即在环上的边只需遍历一次。设该路径长度为 L 1 L_1 L1 ,则在新建一条边后的答案为 2 ( n − 1 ) − L 1 + 1 2(n-1)-L_1+1 2(n−1)