题意
给定一棵带点权带边权的树。
对于一个带边权完全图,两个点之间的连边为(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))都慢...