Description
题目链接:BZOJ 1977
小 C 最近学了很多最小生成树的算法,$\text{Prim}$ 算法、$\text{Kurskal}$ 算法、消圈算法等等。正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了。小 P 说,让小 C 求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说:如果最小生成树选择的边集是 $E_M$,严格次小生成树选择的边集是 $E_S$,那么需要满足($\text{value}(e)$ 表示边 $e$ 的权值):$\sum_{e \in E_M}\text{value}(e)<\sum_{e \in E_S}\text{value}(e)$
这下小 C 蒙了,他找到了你,希望你帮他解决这个问题。
数据范围:$1\le n\le 10^5$,$1\le m,\le 3\times 10^5$,$0\le \text{value}(e)\le 10^9$
Solution
事实上可以证明:有至少一个次小生成树,和最小生成树之间只有 $1$ 条边的差异。
我们先把最小生成树求出来,然后尝试用每一条不在生成树上的边去替换。
考虑不在最小生成树上的边 $(u,v,w)$(其中 $w$ 是边权),在链 $u-v$ 上找到一条最大的严格小于 $w$ 的边。可以注意到,$u-v$ 上肯定没有严格大于 $w$ 的边(否则就不是最小生成树了 QAQ)。我们倍增维护链上的最大边权,每次倍增往上跳时查找严格小于的边权即可。
时间复杂度:$O((n+m)\log n)$
Code
1 |
|