[Graph] CF566C Logistical Questions

题意

一棵 \(n\) 个节点的树,点有非负权值 \(w\),边有非负权值 \(l\),两点间的距离定义为两点间边权和的 \(\dfrac 32\) 次方。

求这棵树的带权重心,即一个节点 \(x\) 使得带权距离和 \(f(x)=\sum_i w_i\operatorname{dis}(u,i)\) 最小,\(n \le 2 \times 10^5\)

题解

化离散为连续,对于一条边 \((u,v)\) 而言,定义 \(f(x)\) 为选择这条边上距离 \(u\)\(x\) 的点时的带权距离和。式子可以写成:

\[\begin{aligned} f(x)&=\sum_{i\in \operatorname{sub}(u)}(d(i,u)+x)^{1.5}+\sum_{i\in \operatorname{sub}(v)}(d(i,u)-x)^{1.5}\\ \dfrac{2f'(x)}{3}&=\sum_{i\in \operatorname{sub}(u)}(d(i,u)+x)^{0.5}-\sum_{i\in \operatorname{sub}(v)}(d(i,u)-x)^{0.5}\\ \dfrac{4f'(x)}{3}&=\sum_{i\in \operatorname{sub}(u)}(d(i,u)+x)^{-0.5}+\sum_{i\in \operatorname{sub}(v)}(d(i,u)-x)^{-0.5} \end{aligned} \]

二阶导变成一堆根号相加了,显然是正的,我们得出任意一条边具有凸性。

同理,我们任选树上一条链,定义 \(f(x)\) 为选择这条链上距离某端点为 \(x\) 的点时的带权距离和,同样有 \(f''(x)\) 是一堆根号相加,我们得出任意一条链具有凸性。

那么不难说明带权重心的形状是一个连通块,因为任选两个带权重心,我把这两个点连起来得是个凸函数,那不就处处相等。

凸函数说明我们可以把最小值当极小值做了,找极小值不就是一直往导数为负的地方走。不妨考虑建立虚点虚边后边分治,计算当前分治重心 \(u\) 到俩子树的贡献关于与 \(u\) 距离的导数,即可确定 \(u\) 是否为极值,如果不是,就可以算出哪个子树存在极值。

posted @ 2022-07-26 14:46  Ilith  阅读(77)  评论(2编辑  收藏  举报