首先是一个有趣的结论:整张图的最小生成树一定只由两种边分别的导出子图的最小生成树的边组成。
证明可以考虑反证法,留作练习(
以下分别称呼两种边为 A 类边和 B 类边。
于是可以求出 A 类边导出子图的最小生成树和 B 类边导出子图的最小生成树,当 \(x\) 非常小的时候,显然答案就是 A 类边的最小生成树。
当 \(x\) 增大时,会逐渐有 B 类边替换掉最小生成树中的 A 类边。
从而考虑这样一个过程:求出每条 B 类边会在何时替换掉哪条 A 类边,将这些「分界线」排序后离线处理询问即可。
但是这并不好求。
事实上,直接按照 \(k\) 从小到大的顺序求每条 B 类边构成的环上最大的 A 类边就是这条 B 类边最后替换掉的 A 类边。
虽然 B 类边显然并不是从小到大替换 A 类边的,但容易发现按此种顺序处理并不会影响结果。
于是采用 LCT 维护即可。
代码:
1 |
|