zoukankan      html  css  js  c++  java
  • 洛谷P4180

    被教练安排讲题 可恶
    这道题我是十月初上课时花了一下午做出来的,当时连倍增都不会,过程比较困难,现在看看还可以
    本来想口胡一发,后来想了想可能以后要用,还是写成文章吧

    Description

    求一棵严格次小生成树的权值和

    Analysis

    次小生成树,分为严格和不严格两种

    把不严格的次小生成树中权值与最小生成树相同的除去,剩下那个的就是严格次小生成树

    所以考虑如何除去非严格部分就行了

    Solution

    既然要求次小生成树树严格小,那就可以维护一个最大值和一个次大值,保证次大值严格小于最大值

    算法方面,使用 Kruskal 和 倍增

    预先 DFS 处理这棵树的点深度,每个点的父亲,最大值和次大值的初始值

    再使用倍增求出每个点所能到达的最大值和次大值

    然后找出一颗最小生成树,统计它的权值和,并对于每条处于最小生成树中的边打一个标记

    对于每条不在最小生成树中的边,找出与它相对的处于最小生成树中的最大的一条边,删去,然后一边跳一边枚举路径上的边权

    然后判断当前枚举边与删去边的权值大小,若相同加入当前边的次大值,否则加入最大值,然后统计权值

    最后把统计出的所有权值取一个最小值就是严格次小生成树的权值

    正确性证明:

    想将一条非树边加入生成树中,就必须删去它的始点终点到公共祖先路径上的一条边,否则就会构成环

    想要使得生成的生成树严格小且尽可能小,就必须使得删去的那条树边尽可能大

    对于每条枚举边,它的权值必定大于等于删去边,为了避免次小生成树不严格,当等于时就只能加入其次大值,否则加入其最大值

    对于所有边都进行此处理,得出权值和最小的必定是严格且最小的生成树

    如此 本题便得到解决

    Other Things

    本题比较恶心,不要读完数据直接建图,否则会爆

    确定好生成树后,只建出一颗最小生成树即可

    另外代码就不放了,到现在时间比较长了,写的也比较丑

    希望各位看懂了

  • 相关阅读:
    二柱子四则运算程序
    测绘软件使用感受
    二分图的最大匹配、完美匹配和匈牙利算法(转载)
    serialVersionUID的用处(转载)
    RMQ(模板)
    codeforces 825E
    红黑树
    SQL 范式(转载)
    java 移位运算
    [Hnoi2010]Bounce 弹飞绵羊
  • 原文地址:https://www.cnblogs.com/KnightL/p/14288349.html
Copyright © 2011-2022 走看看