知识大全 图 - 生成树和最小生成树 - 最小生成树(二)
Posted 知
篇首语:炒沙作縻终不饱,缕冰文章费工巧。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 图 - 生成树和最小生成树 - 最小生成树(二)相关的知识,希望对你有一定的参考价值。
普里姆(Prim)算法
( )算法思想
T=(U TE)是存放MST的集合
①T的初值是(r ¢)
即最小生成树初始时只有一个红点r 没有红边
②T经过n 次如下步骤操作 最后得到一棵含n个顶点 n 条边的最小生成树
⒈选择紫边集中一条轻边并扩充进T
⒉将轻边连接的蓝点改红点
⒊将轻边改红边
⒋修改紫边集
( )较小紫边集的构造
若当前形成的T中有k个顶点 |U|=k |V u|=n k 故可能的紫边数目是k(n k) 从如此大的紫边集中选择轻边是低效的 因此
必须构造较小的紫边集
对于每个蓝点v ∈V U 从v到各红点的紫边中 只有最短的那一条才有可能是轻边 因此 只须保留所有n k个蓝点所关联的最
短紫边作为轻边的候选集即可
( )候选紫边集合的修改
当把轻边(u v)扩充到T时 因为v由蓝变红 故对每个剩余的蓝点j 边(v j)就由非紫边变为紫边 这条新紫边的长度可能小
于蓝点j原来所关联的最短紫边的长度 因此 用长度更小的新紫边取代那些原有的最短紫边
( )Prim算法的伪代码描述
PrimMST(G T r)
//求图G的以r为根的MST 结果放在T=(U TE)中
InitCandidateSet(…);//初始化 设置初始的轻边候选集 并置T=(r ¢)
for(k= ;k
(u,v)=SelectLiShtEdge(…);//选取轻边(u,v);
T←T∪(u,v);//扩充T,即(u,v)涂红加入TE,蓝点v并人红点集U
ModifyCandidateSet(…); //根据新红点v调整候选轻边集
(5) 算法的执行过程
用PRIM算法得到最小生成树的过程【 参见动画演示 】
>
注意:
若候选轻边集中的轻边不止一条,可任选其中的一条扩充到T中。tW.WingWit.
连通网的最小生成树不一定是惟一的,但它们的权相等。
【例】在上图(e)中,若选取的轻边是(2,4)而不是(2,1)时,则得到如图(h)所示的另一棵MST。
(6)算法特点
该算法的特点是当前形成的集合T始终是一棵树。将T中U和TE分别看作红点和红边集,V-U看作蓝点集。算法的每一步均是在连接
红、蓝点集的紫边中选择一条轻边扩充进T中。MST性质保证了此边是安全的。T从任意的根r开始,并逐渐生长直至U=V,即T包含了
C中所有的顶点为止。MST性质确保此时的T是G的一棵MST。因为每次添加的边是使树中的权尽可能小,因此这是一种"贪心"的策略。
(7)算法分析
该算法的时间复杂度为O(n 2 )。与图中边数无关,该算法适合于稠密图。
cha138/Article/program/sjjg/201311/23827相关参考