洛谷P1395 会议
【题意】:
- 给定一棵无根树,定义 u 到 v 的距离为简单路径 (u,v) 上的边的数量。我们把它记为 Tu,v。
- 定义以 u 为该无根树时的花费为 i=1∑nTu,i。即所有点到根 u 的距离和。我们把它记为 Gu。
- 求一个点 u,使得 Gu 最小。输出 u 和 Gu。如有多解,则输出最小的 u。
- 对于 100% 的数据,1≤n≤5×104。
【思路】:
对于无根树类的题目,我们可以先指定一个点当作根。然后再考虑。
具体地,我们先求出以 1 为根时以每个点 u 为根的子树的大小 fu 及 G1。
考虑根从点 u 转移到它的一个儿子 v 时总花费的变化量。可以发现,有等量关系 Gv=Gu−fv+(n−fv)。
什么意思?即 v 的所有儿子到根的距离都减少了 1,但是所有不是 v 的儿子到根的距离都增加了 1。我们可以根据这个来算出所有的 G。可以配图理解 (图丑请原谅)。
总的时间复杂度为 O(n)。可以通过更大的数据(比如 1×106)。
【代码】: