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))都慢...

  • 相关阅读:
    树的一些操作
    线程池的概念
    线程池
    BLOB字段来保存fastreport的报表模板
    D7调用XE2 中间层注意事项
    xe2 datasnap中间层+d7客户端调用
    关于延迟时间的一点智慧

    插件
    phpstorm clone 码云项目到本地 Version Control 不显示
  • 原文地址:https://www.cnblogs.com/Grice/p/14427342.html
Copyright © 2011-2022 走看看