电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

图 - 生成树和最小生成树 - 最小生成树(二)


发布日期:2024/2/5
 

普里姆(Prim)算法

()算法思想

T=(UTE)是存放MST的集合

①T的初值是({r}¢)

即最小生成树初始时只有一个红点r没有红边

②T经过n次如下步骤操作最后得到一棵含n个顶点n条边的最小生成树

⒈选择紫边集中一条轻边并扩充进T

⒉将轻边连接的蓝点改红点

⒊将轻边改红边

⒋修改紫边集

()较小紫边集的构造

若当前形成的T中有k个顶点|U|=k|Vu|=nk故可能的紫边数目是k(nk)从如此大的紫边集中选择轻边是低效的因此

必须构造较小的紫边集

对于每个蓝点v ∈VU从v到各红点的紫边中只有最短的那一条才有可能是轻边因此只须保留所有nk个蓝点所关联的最

短紫边作为轻边的候选集即可

()候选紫边集合的修改

当把轻边(uv)扩充到T时因为v由蓝变红故对每个剩余的蓝点j边(vj)就由非紫边变为紫边这条新紫边的长度可能小

于蓝点j原来所关联的最短紫边的长度因此用长度更小的新紫边取代那些原有的最短紫边

()Prim算法的伪代码描述

PrimMST(GTr){

//求图G的以r为根的MST结果放在T=(UTE)中

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.cOM

连通网的最小生成树不一定是惟一的,但它们的权相等。

【例】在上图(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 )。与图中边数无关,该算法适合于稠密图。

上一篇:查找 - 树上的查找 - 二叉排序树(二)

下一篇:图 - 生成树和最小生成树 - 最小生成树(三)