关于生成树 次小生成树

时间:2021-10-27 12:00:48

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