HXY造公园

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

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

显然l1,l2是固定的,于是我们让du+dv最小就好了

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

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

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

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

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示