zoukankan      html  css  js  c++  java
  • 题目分享M

    题意:

     其实就是找到AB+min(AC,BC)的最大值

    分析:刚看到这道题,很容易往AB为树的直径方向上去想,C就可以遍历每个点,最后求出对于每个点为C时的最大值

    那AB到底是不是树的直径或者为什么AB是树的直径呢?

    (下面是我自己yy的证明方法,可能有不严谨甚至有错误,望指正)

    所有的ABC都可以用这个模型来代替

     也就是在AB这条链上会长出C这样一条分支

    我把AB与C链的交点叫做D

     对于BD CD AD 这三段,将其中较长的两条作为“AB链”,最短那条作为“C链”会更优

    证明:设AD=a,BD=b,CD=c

    若以ab为主链,结果就是 a+b+c+min(a,b)

    若以ac为主链,结果就是 a+b+c+min(a,c)

    若以bc为主链,结果就是 a+b+c+min(b,c)

    显然拿最大的两条作为主链会更优,我们假设AD>=BD>=CD

    那么我们就可以获得一个建立在这个基础上的结论:CD<=BD<=AD<=(AD+BD)/2=AB/2

    也就是CD<=AB/2,还有结果AD+BD+CD+BD<=2AB

    然后就可以正式开始这道题的证明了:

    如果我们设AB为当前树的直径,如果A'B'作为直径更优,分两类讨论

    如果A'B'与AB不相交,那么A'B'<AB/2,那以A'B'为主链的结果<=2A'B'<AB

    而以AB为主链的结果显然大于AB

    所以不成立

    如果A'B'与AB相交,这里还有重合与不重合的讨论,我们先考虑不重合的,令他们的交点为E(这里也遵循AE>=BE的原则)

     能得到EB',A'E<=BE,如果EB',A'E>BE那E'B,A'E就会代替BE成为最长链,那就会变成重合的情况了

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    !!!!注意   A'B'链中的D'点永远不可能在AB链中,这条规则在任何条件下都适用,如果这里没想明白,后面很可能自己证着证着就因为画图改变初始规则导致证不下去(亲身体会)

    !!!!因为如果D'点与D点重合,A'D比AD 要短,B'D比BD 要短,A'B'永远不可能超越AB,如果A'D比AD长或者B'D比BD 长的话显然AB就不是最长链了,A'B或AB'就成最长链了

    !!!!(这里我认为是我证这个路上最大的绊脚石)

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    在我现在无论C'点在哪,我的C点都去与C'点重合,再根据我们命名的规则把D,D'给标记出来

     以A'B'为主链的结果就是A'B'+C'D'+B'D'=A'E+ED'+D'B'+C'D'+B'D'

    以AB为主链的结果就是AB+CD+BD=AE+EB+CD'+D'E+BE

    两边作差就会发现

    AB-A'B'=(AE+BE*2)-(A'E+B'D*2) 

    而我们的B'D'<=B'D<=BD,A'E<=AE

    所以A'B'<=AB

    然后就是AB与A'B'重合的可能

     这里还是无论C'点在哪,C点都与他重合

    这里的证明方法其实跟AB与A'B'相交的证明方法类似,这里就不再证一遍了

    !!!!!唯一需要再强调一遍的就是一定不要把A'与A 或者B'与B标反了

    !!!!!别突然想到一组数据,自己手玩发现不符合这个规律,结果是A'D比AD都要长了

    最后再回归到这个题上

    求出最长链之后,处理出最长链端点到每个节点的距离,把每个节点当做C计算一遍,取最大值就可以了

    代码:

     

     

     ps:我主函数写的稍微有些图方便,比如都是k,可能理解起来比较麻烦,不过这题证出是直径之后就很简单了,稍微看一下代码的流程绝对能写出来,不需要理解我这种写法

  • 相关阅读:
    Oracle的数据库,实例,服务名
    ubuntu14.04安装oracle 11g
    sqlldr导入导出需要注意的问题
    EOF字符串
    登录plsql developer时候出现连接串问题导致的下拉列表中没有出现tnsnames.ora文件中配置的那些服务
    Oracle导出数据中的prompt,set feedback 等是什么意思
    怎么给普通用户付给权限,让它能读取v$session表
    Oracle数据库状态
    管理子程序
    pl/sql developer安装与配置
  • 原文地址:https://www.cnblogs.com/lin4xu/p/12665962.html
Copyright © 2011-2022 走看看