直径

法一:先求出一条直径,显然只有这条直径上的边才可能是答案

我们考虑最终答案怎么来的,我们把树看成这个样子

其中中间红色的是我们找出来的直径

那么其他直径只有可能是从分支开始走,然后到红色线上面走一段,最后再走到另一分支上(注意直径的端点都是叶子节点)

我们把所有直径都画出来,每次都取交集,然后就可以发现最终的答案一定是连续的一段

于是我们就枚举寻找左右端点,可看这篇题解,写的比较清楚

法二:

对一条边(u,v)(假设uv的父亲),如果这条边是某一条直径要经过的,那么一定满足v往其子树走到的最远距离加上u不往v的子树走而走到的最远距离加上这条边的长度等于直径(所以要记录一个点往子树走的最远距离以及次远距离,还要用换根DP);而且还要记录每个值走的方法,并且对每个满足条件的点利用乘法原理统计,最后统计出的最大值就是直径条数

法三:这篇题解,看不懂

update 2024.5.26

其实法一利用“树网的核”的结论很容易做。把中点画出来,树就长成这个样子了

所以左右两边的离中点最近的拐点之间的边就是必经边了

如何找出拐点?随便选一条直径,然后像“树网的核”一样,求出d数组表示直径上的点不经过其他直径上的点能够到达的最远的点;然后从中点向两边走就可以判断第一个拐点了

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