最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、普里姆(Prim)算法
1)算法的基本思想:
普里姆算法的基本思想:普里姆算法是另一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。
从连通网络 N = { V, E }中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把该边加入到生成树的边集TE中,把它的顶点加入到集合U中。如此重复执行,直到网络中的所有顶点都加入到生成树顶点集合U中为止。假设G=(V,E)是一个具有n个顶点的带权无向连通图,T(U,TE)是G的最小生成树,其中U 是T的顶点集,TE是T的边集,则构造G的最小生成树T的步骤如下:
(1)初始状态,TE为空,U={v0},v0∈V;
(2)在所有u∈U,v∈V-U的边(u,v) ∈E中找一条代价最小的边(u′,v′)并入TE,同时将v′并入U;
重复执行步骤(2)n-1次,直到U=V为止。
在普里姆算法中,为了便于在集合U和(V-U)之间选取权值最小的边,需要设置两个辅助数组closest和lowcost,分别用于存放顶点的序号和边的权值。
对于每一个顶点v∈V-U,closest[v]为U中距离v最近的一个邻接点,即边(v,closest[v]) 是在所有与顶点v相邻、且其另一顶点j∈U的边中具有最小权值的边,其最小权值为lowcost[v],即lowcost[v]=cost[v][closest[v]],采用邻接表作为存储结构:
设置一个辅助数组closedge[]:
lowcost域存放生成树顶点集合内顶点到生成树外各顶点的各边上的当前最小权值;adjvex域记录生成树顶点集合外各顶点距离集合内哪个顶点最近(即权值最小)。
应用Prim算法构造最小生成树的过程:
如下所示为构造生成树的过程中,辅助数组中各分量值的变化情况,初始归U={v1},加入到U集合中的节点,我们将lowcost改成0以示:
Prim算法
1.概览
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch J arník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
2.算法简单描述
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:V new = {x},其中x为集合V中的任一节点(起始点),E new = {},为
空;
3).重复下列操作,直到V new = V:
a.在集合E中选取权值最小的边,其中u为集合V new中的元素,而v不
在V new集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的
边,则可任意选取其中之一);
b.将v加入集合V new中,将边加入集合E new中;
4).输出:使用集合V new 和E new 来描述所得到的最小生成树。
下面对算法的图例描述
图例 说明 不
可
选
可选 已选(V new )
此为原始的加权连通图。每条边一
侧的数字代表其权值。 - - -
顶点D 被任意选为起始点。顶点A 、B 、E 和F 通过单条边与D 相连。A 是距离D 最近的顶点,因此将A 及对应边AD 以高亮表示。 C, G A,
B,
E,
F
D
下一个顶点为距离D 或A 最近的
顶点。B 距D 为9,距A 为7,E
为15,F 为6。因此,F 距D 或A
最近,因此将顶点F 与相应边DF
以高亮表示。
C, G B, E, F
A, D
算法继续重复上面的步骤。距离A
为7的顶点B被高亮表示。
C
B,
E,
G
A, D, F
在当前情况下,可以在C、E与G
间进行选择。C距B为8,E距B
为7,G距F为11。E最近,因
此将顶点E与相应边BE高亮表
示。
无
C,
E,
G
A, D, F, B
这里,可供选择的顶点只有C和G。
C距E为5,G距E为9,故选取
C,并与边EC一同高亮表示。
无
C,
G
A, D, F, B,
E
顶点G是唯一剩下的顶点,它距F
为11,距E为9,E最近,故高亮
表示G及相应边EG。
无G
A, D, F, B,
E, C
克鲁斯卡尔(Kruskal)算法求最小生成树
1、基本思想:设无向连通网为G=(V, E),令G的最小生成树为T=(U, TE),其初态为U=V,TE={ },然后,按照边的权值由小到大的顺序,考察G的边集E中的各条边。若被考察的边的两个顶点属于T的两个不同的连通分量,则将此边作为最小生成树的边加入到T中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T中的连通分量个数为1时,此连通分量便为G的一棵最小生成树。
2、示例: