关闭

最小生成树算法---Kruscal算法和Prim算法(入门)

标签: 算法primkruscal最小生成树图论
595人阅读 评论(0) 收藏 举报
分类:

问题描述

假设现在有n个城市,我们要在城市之间修路,使得我们无论从哪一个城市出发,都能通过某种路线到达另一个城市。在不同的城市之间修路,所需费用也不同,求如果要使得每个城市之间连通,最少的花费是多少。
假设城市是结点,结点间的连线的权重就是费用,我们要求的最小花费所选取的边和所有的结点所构成的就是最小生成树。

算法描述

  • 最小生成树的唯一性
    最小生成树不一定是唯一的。
    如图下图1,图2,红色的边连接的结点所构成的两种树都是最小生成树。
    这里写图片描述

    1 

    这里写图片描述
    2 

  • Kruscal的算法过程
    采用贪心的策略,每次从所有边中选取最小的边,限制条件是加入这条边后不能使当前的结点形成回路。
    下面图3-图11是Kruscal算法的选取边的过程。
    这里写图片描述

    3 

    这里写图片描述
    4 

    这里写图片描述
    5 

    这里写图片描述
    6 

    这里写图片描述
    7 

    这里写图片描述
    8 

    这里写图片描述
    8 

    这里写图片描述
    10 

    这里写图片描述
    11 

  • Prim算法过程
    同样是采用贪心的策略,第一步任意选取一个结点加入集合A,选择边的时候,选择连接A和其余不再A中点的最小权重的边(和Dijkstra单源最短路算法类似)。
    下面图12-图20是采用Prime算法的生成过程。

    这里写图片描述

    12 

    这里写图片描述
    13 

    这里写图片描述
    14 

    这里写图片描述
    15 

    这里写图片描述
    16 

    这里写图片描述
    17 

    这里写图片描述
    18 

    这里写图片描述
    19 

    这里写图片描述
    20 

算法实现

假设G1(V,E)图中的最小生成树是G2(V,A) (AV  )

  • Kruscal算法
    1 将边集按照权值从小到大排序
    2 遍历边集选取边e
    3 判断加入e是否使得A集合中结点形成回路(e连接的2个结点都已经在A中)
    4 如果没形成则将e加入A中
    5 重复2-4步
    6 G2(V,A)即最小生成树
Created with Raphaël 2.1.0开始边集遍历完成?结束遍历边集选取边e形成回路?将e加入A集合yesnoyesno
  • Prime算法
    1 任意选取一点加入集合A中
    2 选取连接A和A之外的最小权重边加入A
    3 A中包含所有结点则结束运算
    4 否则重复第2步
Created with Raphaël 2.1.0开始 任意选取一点加入集合A中选取连接A和A之外的最小权重边加入AA中包含所有结点?结束yesno

区别与联系

不论是Kruscal算法还是Prim算法,都是采用了贪心的策略,Kruscal算法是对边集的操作,Prim算法是对点集的操作。

Kruscal算法中,集合A是一个森林,其结点就是给定图的结点。每次加入到集合A中的安全边永远是权重最小的连接两个不同分量的边。
Prim算法中,集合A是一棵,每次加入到A中的安全边永远是连接A和A之外 的某个结点的边中权重最小的边。

参考资料:
算法导论-Thomas H.Cormen、Charles E.Leiserson
wiki百科

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

图的最小生成树之Prim算法

图的最小生成树是指一颗连接图中所有顶点,具有权重最小的树,树的权重为所有树边的权重之和。最小生成树可以应用在电路规划中,规划出既能连接各个节点又能使材料最为节省的布局。计算最小生成树有两个经典算法,分...
  • Ivan_zgj
  • Ivan_zgj
  • 2016-05-31 18:48
  • 1964

最小生成树prim和kruscal的算法实现

  • 2012-12-30 11:07
  • 1.02MB
  • 下载

Kruscal算法

参考:http://blog.csdn.net/luomingjun12315/article/details/47700237 Kruskal算法       Kruskal算法是基于贪心的思...
  • FrankAx
  • FrankAx
  • 2017-07-23 15:34
  • 485

关于Kruskal算法和Prim算法的个人理解

Kruskal和Prim算法都是用来计算最小生成树的算法。 总的来说应该可以算是图论那里比较基础的部分了,之前也有学习过,不过其实了解的也就是一知半解。说是能说,但是实际上的理解根本不够透彻。(...
  • dy13145687
  • dy13145687
  • 2015-04-22 22:56
  • 1259

图的最小生成树之Prim算法

图的最小生成树是指一颗连接图中所有顶点,具有权重最小的树,树的权重为所有树边的权重之和。最小生成树可以应用在电路规划中,规划出既能连接各个节点又能使材料最为节省的布局。计算最小生成树有两个经典算法,分...
  • Ivan_zgj
  • Ivan_zgj
  • 2016-05-31 18:48
  • 1964

最小生成树-Kruscal算法

所谓最小生成树,就是在一个具有N个顶点的带权连通图G中,如果存在某个子图G',其包含了图G中的所有顶点和一部分边,且不形成回路,并且子图G'的各边权值之和最小,则称G'为图G的最小生成树。      ...
  • lqcsp
  • lqcsp
  • 2013-11-04 07:09
  • 871

最小生成树-Prim算法和Kruskal算法

Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (...
  • gettogetto
  • gettogetto
  • 2016-11-18 15:11
  • 2822

算法基础 - 最小生成树(Kruscal算法)

最小生成树就是让一个图里,生成一个树状图,任意两个节点只有唯一的路径到达,并且让这个距离最短。Karuscal算法这个算法是相对于Prim算法( 传送门:Prim算法 )的另外一个算法,这个算法主要的...
  • chenfs1992
  • chenfs1992
  • 2016-05-27 17:02
  • 540

最小生成树(prim算法,kruskal算法)

对于边上有权的图来说,边权值和最小的生成树叫做这个图的最小生成树。如果一个图的边权值都不相同那么最小生成树是唯一的。 求无向图的最小生成树主要有prim算法和kruskal算法两个。 prim算法思想...
  • theArcticOcean
  • theArcticOcean
  • 2015-06-27 19:29
  • 886

最小生成树-Prim算法和Kruskal算法

Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。...
  • apollo_miracle
  • apollo_miracle
  • 2016-02-25 15:50
  • 355
    个人资料
    • 访问:354829次
    • 积分:10604
    • 等级:
    • 排名:第1821名
    • 原创:693篇
    • 转载:14篇
    • 译文:0篇
    • 评论:65条
    `
    加油加油 努力努力
    博客专栏
    文章分类