zoukankan      html  css  js  c++  java
  • 关于生成树 次小生成树

    1.对于最小生成树的任何一条边e,将它去掉后形成两个集合u和v,则e是u,v两集合间所有边中最小的(假设不是,则可以把e去掉换成一条更小的边,从而形成一棵更小的生成树,矛盾)

     

    2.在最小生成树中的第K长边是所有生成树中第K长边的最短边。设该边为e,将它去掉后形成两个集合u和v,若是生成树,那么在u和v间一定有边,所以加上一条边要比e大,此时将新生成树的边排序,在最小生成树中比e大的边有k-1条,加上新添的,比e大的一共有k条,所以新生成树中第K长边大于e。

     

    3.次小生成树可由最小生成树换一条边得到

         证法一 :可以证明下面一个更强的结论:T是一棵最小生成树,T0是一棵异于T的树,通过变换 T0 ---> T1 ---> T2 ---> ...... ---> Tn(T)变成最小生成树。所谓的变换是,每次把Ti中的某条边换成T中的一条边,而且树T(i+1)的权值小于T(i)的权值。

         具体操作是 : ① 在 T(i)中任取一条不在T中的边e

                                ② 把e去掉,剩下两个连通分量u,v,在T中必有唯一的边e1连接u和v

                                ③ 显然e1的权比e小,将e换为e1即可得树T(i+1)

         特别的取T0为任一棵次小生成树,T(n-1)也就是次小生成树且跟T差一条边,得证。

         证法二:设T,T1为原图的最小生成树和次小生成树,由定义,不存在权值介于T和T1间的树,设T的边E(T) ={e1,e2,e3.....en},且边按权值从小到大排列,T1的边集E(T1)={f1,f2,f3......fn},且边按权值从小到大排列,设k是第一个使ek不等于fk的下标,显然有ek<fk(若不是的话由最小生成树kruskal的执行过程,先扫描到fk,后扫描到ek,且fk也连接了两个不同的集合,所以会选择fk,矛盾),将ek加入到T1中形成一个环,该环上只有唯一的一条边fj大于ek,否则,用ek替换该环上比ek大的边会形成权值不同且小于T1的树,因为权值比T1还小的数只有T,所以矛盾,所以将ek替换fj后得到最小生成树T,得证。

    4.次小生成树算法

     一种容易想到的方法是枚举删除最小生成树上的边,再求最小生成树(前提是去掉一条边后剩下的边还能形成树),所得的最小值即为次小生成树的权值。但复杂度高,相当于运行了n次最小生成树算法。

        但有一种更简单的方法:先求最小生成树T,枚举添加不在T中的边,则添加后一定会形成环。找到环上边值第二大的边(即环中属于T中的最大边),把它删掉,计算当前生成树的权值,取所有枚举修改的生成树的最小值,即为次小生成树。

        这种方法在实现时有更简单的方法:首先求最小生成树T,并用一个二维数组max[u][v]记录结点u到结点v的路劲上边的最大值(即最大边的值)。然后枚举不在T中的边(u,v),计算T- max[u][v] + w(u,v)的最小值,即为次小生成树的权值。对于max数组可以在prim的加边过程中不断更新,算法的具体实现见http://blog.csdn.net/kidgin7439/article/details/9852017

     

  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/vermouth/p/3710229.html
Copyright © 2011-2022 走看看