[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\) 是否为极值,如果不是,就可以算出哪个子树存在极值。