Link
Solution
如果在树上的话,答案显然就是树的直径。然后发现这道题的距离可以是实数,似乎不好设计状态DP,于是思考如何向树上转化。 基环树,处理的最常见的思路也就是拆环了(一个LCT好题)。那么把这个图的环枚举边拆掉,是不是直接求直径就行了? 然后观察一下,发现不管把点放在哪里,环上一定有一条边是不会被经过的。所以只要枚举断点拆环,得到的直径的最小值就是答案了。 至于直径,一定是来源于环上挂着的子树的直径,或者是一个子树的一条链,经过环走到另一个子树。 第一种可以预处理 至于第二种,感觉做法挺有意思的。 设当前断点为,其它所有点到的距离为,每个子树中的最长链为,那么这个答案就是 把变量分离开,发现就是个只需要维护的最大值,和的最小值即可! 所以建立两个线段树分别维护着两个量,那么当枚举的断边改变的时候该如何实时修改线段树的信息呢? 发现,如果硬是要维护到断点的距离的话,那么就会这样变化: 似乎比较麻烦的样子? 然而本来这个就是个前缀和,需要的只是它两项的差值。只要维护相对大小正确就行了。于是修改断边,只需要修改一个点的值就可以,直接把它的设置为它的前驱的即可。。虽然比较显然,但我还是感觉比较有意思。。
Tips
维护前缀和数组,可以只需要维护值的差正确 基环树先想拆环
Code
1 | //Code by Lucida |