【题解】P3629 [APIO2010] 巡逻(树的直径)

本文介绍了如何解决[APIO2010]巡逻问题,即在限制新建道路数量K(1≤K≤2)的情况下,找到最小巡逻距离。文章详细探讨了当K=1和K=2时的策略,包括利用两次BFS/DFS或树形DP求解树的直径,以达到减少巡逻距离的目的。
摘要由CSDN通过智能技术生成

【题解】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 n1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其他任一个村庄。每条道路的长度均为 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(1K2)。接下来 n – 1 n – 1 n1 行,每行两个整数 a , b a, b a,b, 表示村庄 a a a b b b 之间有一条道路 ( 1 ≤ a , b ≤ n ) (1 ≤ a, b ≤ n) (1a,bn)

输出格式
输出一个整数,表示新建了 K K K 条道路后能达到的最小巡逻距离。

100 100 100%的数据中, 3 ≤ n ≤ 100 , 000 , 1 ≤ K ≤ 2 3 ≤ n ≤ 100,000, 1 ≤ K ≤ 2 3n100,000,1K2


S o l u t i o n \rm Solution Solution

一个较为重要的限制条件:

1 ≤ K ≤ 2 1 ≤ K ≤ 2 1K2

分两类讨论

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(n1)

新建一条边 ( 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(n1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值