Tree Mst

题意

给定一棵带点权带边权的树。
对于一个带边权完全图,两个点之间的连边为\(dist(i,j)+w_i+w_j\),求这个图的最小生成树权重。
\(n\le 10^5\)

做法一

结论1:对于一个图,考虑任意诱导子图的任意最小生成森林,保留最小生成森林边集,移除剩余属于该诱导子图的边,该图最小生成树权重不变。

证明显然

考虑一棵树,令其根为\(root\)
得到每个子树的最小生成树,保留其边集
那么再考虑这棵树的最小生成树,在原子树边集基础上,需要增加哪些边呢?

结论2:将每个点的权重改写为\(w_i'=dist(i,root)+w_i\),那么不同子树的点对的边边权为\(w_i'+w_j'\),令\(x\)\(\{w_i'\}\)最小的\(w_i\),那么仅需新增\((x,i,w_i'+w_i')\)这样的边。

证明:
反证法
考虑若有两个不在同一子树(将\(root\)单独看作一棵子树)的点\(u,v(u\neq x,v\neq x)\)间在所有的最小生成树上均有连边
考虑\(u,v,x\)所在的诱导子图,\((u,x)(v,x)\)为该图的最小生成树,根据结论1,去掉\((u,v)\)后最小生成树权值不变

考虑点分治刚才的过程,这样总边数是\(O(nlogn)\),总复杂度\(O(nlog^2n)\)

做法二

本来打算写个\(O(nlogn)\)的算法,但实测跑得比\(O(nlog^2n)\)都慢...

posted @ 2021-02-21 21:38  Grice  阅读(158)  评论(4编辑  收藏  举报