个人思路:
换根。
从 \(1\) 开始 DFS 遍历。对于一个点,维护 \(mx1_u = \min\limits_{v\in child_u} mx1_v + 1\),\(mx2_u\) 为 \(\min\limits_{v\in child_u} mx2_v\) 和 \(mx1_v\) 的次小值两者的较小值。
然后再次从 \(1\) 开始 DFS 遍历,用父亲更新儿子,需要维护删去每个儿子之后的值。因此对于 \(u\) 需要记录 \(mx1_v\) 的次大值和第三大值,\(mx2_v\) 的次大值。