|
次小生成树
O(V^2)
\*==================================================*/
结论
次小生成树可由最小生成树换一条边得到
.
证明
:
可以证明下面一个强一些的结论:
T
是某一棵最小生成树,
T0
是任一棵异于
T
的树,通过变换
T0 --> T1 -->
T2 --> ... --> Tn (T)
变成最小生成树
.
所谓的变换是,每次把
T_i
中的
某条边换成
T
中的一条边
,
而且树
T_(i+1)
的权小于等于
T_i
的权
.
具体操作是:
step 1.
在
T_i
中任取一条不在
T
中的边
u_v.
step 2.
把边
u_v
去掉,就剩下两个连通分量
A
和
B
,在
T
中,必有唯一的
边
u'_v'
连结
A
和
B.
step 3.
显然
u'_v'
的权比
u_v
小
(
否则
,u_v
就应该在
T
中
).
把
u'_v'
替换
u_v
即得树
T_(i+1).
特别地:取
Tn
为任一棵次小生成树,
T_(n-1)
也就是次小生成树且跟
T
差一条边
.
结论得证
.
算法:只要充分利用以上结论
,
即得
V^2
的算法
.
具体如下:
step 1.
先用
prim
求出最小生成树
T.
在
prim
的同时,用一个矩阵
max[u][v]
记录在
T
中连结任意两点
u,v
的唯一的路中权值最大的那条边的
权值
. (
注意这里
).
这是很容易做到的,因为
prim
是每次增加一个结点
s,
而
设已经标号了的结点集合为
W,
则
W
中所有的结点到
s
的路中的最大权值的边就
是当前加入的这条边
. step 1
用时
O(V^2).
step 2.
枚举所有不在
T
中的边
u_v,
加入边
u_v
替换权为
max[u][v]
的边
.
不断更新求最小值,即次小生成树
. step 2
用时
O(E).
故总时间为
O(V^2).