zoukankan      html  css  js  c++  java
  • 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))都慢...

  • 相关阅读:
    lambda表达式
    各种模块化简介及演变过程
    filter-api文档
    RegExp正则表达式规则以及常用正则表达式
    各种循环遍历对比
    条件语句对比
    莫队小结
    停更公告
    POJ2728 Desert King
    笛卡尔树Cartesian Tree
  • 原文地址:https://www.cnblogs.com/Grice/p/14427342.html
Copyright © 2011-2022 走看看