现在的位置: 首页 > 综合 > 正文

最小生成树

2018年02月20日 ⁄ 综合 ⁄ 共 1033字 ⁄ 字号 评论关闭

术语:

    树(Tree)

             不含圈的连通图称为树。

     生成树SpanningTree):

             设T是图G的一个子图,如果T是一棵树,且v(T)
= v(G),则称T是G的一个生成树。// v()为点集。

     
最小生成树MinimalSpanningTree):

             权值最小的生成树称为最小生成树。

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------


求解最小生成树问题,最常的两算法:Kruskal算法和Prim算法。


一、Prim算法:

基本概念:

       Prim算法是用于生成无向带权连通图的MST的一种算法,并且可以解决边权为负值的情况。Prim算法从任一顶点s开始,初始化V' ={s},每次贪心地选取跨越V与V - V' 的最小边,扩大现有的子树V‘,直到其遍及图中的所有顶点。

算法流程:

       (1) 标记所有点为未访问,初始化距离数组

       (2) 选定任一顶点作为起点,标记其已访问,dist = 0

       (3) 找出所有未访问过的点中距离值最小的点u,标记u已访问,将最后一次松弛的边加入生成树

       (4) 用点u的相邻边进行松弛,被松弛的点v记录下(u,v)这条边

       (5) 重复操作(3)和(4)直到所有点都访问过


二、Kruskal算法:

基本概念:

        Kruskal算法将图中的每一顶点视为一个独立的集合,首先将图中的所有边按权值从小到大排序,接着按顺序选择每条边,如果这条边的两个端点不属于同一个集合,那么将它们所在的集合合并,同时将这条边加入边集E‘。直到所有的顶点都属于同一个集合时,E’就是一棵最小生成树。

算法流程:

        1)将图G看做一个森林,每个顶点为一棵独立的树

       
(2)将所有边加入集合S,即一开始S = E

        (3)从S中拿出一条最短的边(u,v),如果u和v不在同一棵树内,连接u,v合并两棵树,同时将(u,v)加入生成树的边集E

        (4)重复(3)直至所有点属于同一棵树,边集E’就是一棵最小生成树


抱歉!评论已关闭.