【学习笔记】Kruskal 重构树
算法思想
由于最小瓶颈树一定是最小生成树,所以瓶颈路问题可以和最小生成树算法结合,通过记录下 Kruskal 求最小生成树过程中的一些信息,可以实现瓶颈路的查询。
实现
考虑模拟 Kruskal 最小生成树的过程,当两个连通块合并时,新建一个节点作为二者的父亲,并将这条边的边权作为这个新建节点的父亲,这样可以得到一个 \(2n-1\) 的树。
例题
不难发现,每个非叶子节点的子树都表示当限制边权小于等于该节点权值时(最大生成树为大于等于),可以互达的节点集合,利用这个性质可以解决限制瓶颈的问题。
同时可以解决形如 \(\sum_{i=1}^n\sum_{j=i+1}^n \mathrm{maxdis}(i,j)\),其中 \(\mathrm{maxdis}(i,j)\) 表示 \(i,j\) 路径上最大边权。
LibreOJ-137 最小瓶颈路(加强版)
模板题,需要 \(O(1)\) 求 \(\mathrm{LCA}\)。
Luogu-P4768 NOI 2018 归程
有了瓶颈的限制,很明显是查一下重构树的子树最值,Dijkstra 预处理一下。
CodeForces-1578L Labyrinth *2400
重构树上 DP。
不难发现更优的策略一定是先解决一个子树再解决另一个子树,也就划分成了子问题,设 \(f_u\) 为保证 \(u\) 子树全部吃完时初始进入的最大值。容易得到,我们初始在哪个位置并不重要,因为一定可以先不吃而走到真正适合的位置,于是有转移方程:
\[f_u=\max\{\min\{f_{v1},w(u,v1)\}-sum_{v2},\min\{f_{v2},w(u,v2)\}-sum_{v1}\}
\]
判断一下是否合法即可。
Luogu-P7834 ONTAK 2010 Peaks 加强版
重构树子树内查询区间第 \(k\) 大,上一个可持久化线段树。