LINK:cactus仙人掌图
求仙人掌图的直径。
每条边最多属于一个环中 那么每条边要么是割边要么是环中边。
求直径,考虑直径由某个点发出 套用树形dp求直径。f[x]表示从x出发的最长链。
发现带环很难搞 对于某个环 我们能够找到其由于点双的存在如果发现没有割点的存在那么一定有环了(自环也算.
考虑在求点双的时候把环搞出来。
对于环 此时我们让每个点都得到环上的贡献 且此时更新全局答案 也同时更新f[x]的答案。
可以发现答案所在这样可以dp出来。
对于环上的贡献破环成链后 采用单调队列优化转移即可。
最后还是觉得这个做法的正确性没有很好的说明。
考虑直径所在 必然由两个点之间的距离加两个点所能延伸的不重合的最长距离得到。
在dp的过程中 可以保证f[x] f[tn]的不重合性。
考虑在树上时我们都是直接合并的 考虑出现了环 且环和环之间没有重边 这意味着f[x] f[tn]也存在不重合性。
考虑在环上怎么办 儿子仍然是儿子 但是整个环可能可以作为答案 所以我们任选换上两点进行更新答案。
外部的不用管。所以可以发现这样做是正确的。