题意简述
给定一个树 $T$ ,求一个完全图 $G$ 使得 $T$ 是 $G$ 的最小生成树,并且 $G$ 的边权和最小。求出这个最小的边权和。$T$ 的点数 $n\le 10^5$,每个边权 $w\le 10^5$
思路
我们把 $T$ 中的边权排一下序,反向推一下 Kruskal
算法的步骤。
我们每次考虑到第 $i$ 条边 $(u,v,w)$,假设这之前的 $i-1$ 条边已经构造好了若干个都是完全图的联通块,并且 $T$ 中的前 $i-1$ 条边就是这些联通块的生成树(也就是保证了 Kruskal
算法前 $i-1$ 步都选的是 $T$ 中的边)。
在连上 $(u,v,w)$ 之前,$(u,v)$ 应该分在两个联通块里。我们把 $(u,v,w)$ 连起来之后,对于两个联通块里除了 $(u,v)$ 以外的所有点对,都连一条权为 $w+1$ 的边。这样,显然在 Kruskal
算法的第 $i$ 步中,选的是第 $i$ 条边(因为现在只剩下两个联通块连接,除了 $(u,v,w)$ 之外所有的边权都 $\ge w$,肯定得选 $(u,v,w)$)
所以我们把 $T$ 中的边按边权排序,并查集合并的时候记录一下联通块大小。然后 $(u,v,w)$ 这条边的贡献就是 $(cnt[u]\times cnt[v]-1)\times (w+1)$
代码
1 |
|