HXY造公园

显然题目的图在任意时刻都是一个森林

当连接两棵树的时候,显然两棵树原来的直径(设为\(l_1,l_2\))是会被记录在答案中的,假设我们连的点是\(u\)\(v\),设\(d_x\)表示\(x\)在其连通块内能走到的最远的距离,那么答案肯定就是要\(max(l_1,l_2,1+d_u+d_v)\)最小

显然\(l_1,l_2\)是固定的,于是我们让\(d_u+d_v\)最小就好了

所以到这里其实已经有一个解法了:对每个并查集维护\(d\)值最小的节点作为树根,更新答案的时候就可以直接更新,而且可以证明,合并之后的集合\(d\)值最小的节点一定是合并之前的两个集合的根节点中的一个,于是我们加边直接加在两个集合的根节点之间就好了

比如,设一个集合的根节点为\(u\)。对于这个集合中一个不是根节点的节点\(x\)考虑,合并之后其的\(d\)值:如果合并后\(x\)的最远路径仍然在原来这个集合中,那么就说明从\(x\)\(u\)再经过新加的边到另一个集合的最远路径的长度更小,然而从\(x\)\(u\)再经过新加的边到另一个集合的最远路径的长度显然比从\(u\)经过新加的边到另一个集合的最远路径的长度长,于是合并后\(x\)的最远路径比从\(u\)经过新加的边到另一个集合的最远路径的长度长,根据合并之前根节点的性质,合并后\(x\)的最远路径仍然比合并前\(u\)的最远路径长,于是合并后\(d_x\)一定大于\(d_u\);对于合并后\(x\)的最远路径经过新加的边仍然可以这么讨论。证毕

但是,根据BFS求树的直径的第一步操作,我们可以知道对任意节点的\(d\)所代表的路径的终点一定是一条直径的一端,于是我们画出直径,就不难得出题解的贪心结论了

所以以后在遇到“一个点在这棵树所能走的最远的距离”一定要联想到树的直径的一个端点,说不定就能简化问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值