逃学的小孩

一个性质:AB一定是直径的两端点

这个证明比较简单,我们假设一条非直径路径DE,然后随便选一个点作为C,通过讨论ABDE是否相交即可

当然还有更简单的想法,我们随便找一个点C,然后假设AC更近,就有最终的长度是AC+BA,其中AC的长度最长是离C最远的点的距离,BA的长度最长是直径。而想一下我们是怎么用BFS求直径的:我们随便找一个点,然后找出离这个点最远的点,那么这个点一定是直径的端点,然后找出离这个点最远的点,就找出直径了。而我们最开始随便找的点就认为是C的话,如果AB刚好是我们找出的另外两个点,那么刚好ACAB同时取到最大值,所以我们上述的性质是正确的

所以我们随便找一条直径(当然其实这个东西也需要证明,然而。。。whatever,从考试的角度考虑吧),然后枚举C即可

我自己也想到一个办法,我们考虑,我们随便找三个点,那么这三个点一定在一条直线上,C在哪呢?C肯定是在中间那个点上,于是乎我们可以利用换根DP做这道题目

我们需要知道从每个点出发的最长路径和不严格次长路径,在树形DP的时候,我们分从根节点向下的最/次长和从根节点向上的最/次长即可。自己推到一下状态转移方程

update 2024.5.26

这道题目的证明用“树网的核”的图来证非常easy

假设A,B不是直径的两端,那么A,B最多只有一个点在直径的一端,于是再分C的位置讨论就好了,比如

如果说CA更近,那么显然将B换成D答案会更优;如果CB更近,那么不换的答案长成这个样子(数字表示边被计算的次数)

换成D之后被计算的次数为

两图相减根据直径的最长性就很容易得出来了

但是我自己的做法我却看不懂了。。。

update 2024.8.17

感觉上面的证明不是很严谨,比如这种情况

image

此时必须将C,B交换位置之后才可说明B换成D的距离更长

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