洛谷 P4886 快递员
传送门 介是你没有体验过的 \(chuan\) 新做法。 暴力点分治算出每个点作为中心时的答案。 对于路径 \(c\rightarrow u\rightarrow c\rightarrow v\rightarrow c\) 的长度除以 \(2\) ,我们可以看做 \(dis(u,v)+c\) 到路径 \((u,v)\) 的距离乘 \(2\) 。 把路径分成两类: 经过分治中心的: 对于这种路径, \(dfs\) 一遍树,当脱离了某条路径时,比如走边 \((2,4)\) 或 \((2,5)\) ,开始计算该路径的贡献。假设走边 \((x,y)\) 脱离了该路径,则 \(y\) 子树内每个点 \(i\) 都会有 \(dis(i,x)\times 2+dis(u,v)\) 的贡献。 具体实现:给每条边维护一个权值 \(V\) ,对每条路径上的边的 \(V\) 对 \(dis(u,v)\) 取 \(\max\) 。算出每个点每条出边 \(V\) 的最大值和次大值。 \(dfs\) 时维护当前最大贡献 \(now\) ,对每个点,等于该点最大值的边选次小值更新 \(now\) ,否则选最大值,累加边权乘 \(2\) 即可。 这样会发现从根节点开始 \(dfs\) 时会出现这种情况: 此时,红色路径和绿色路径为最大和次大。 由于一条路径可能会占据根节点的两条出边,维护最大值和次大值就出 \