Tree Mst

题意

给定一棵带点权带边权的树。
对于一个带边权完全图,两个点之间的连边为(dist(i,j)+w_i+w_j),求这个图的最小生成树权重。
(nle 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 eq x,v eq x))间在所有的最小生成树上均有连边
考虑(u,v,x)所在的诱导子图,((u,x)(v,x))为该图的最小生成树,根据结论1,去掉((u,v))后最小生成树权值不变

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

做法二

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

原文地址:https://www.cnblogs.com/Grice/p/14427342.html