次小生成树 O(V^2)

| 次小生成树 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).

你可能感兴趣的:(算法)