• 最小生成树(普利姆算法、克鲁斯卡尔算法)


    给定一个带权的无向连通图,怎样选取一棵生成树,使树上全部边上权的总和为最小,这叫最小生成树.

    求最小生成树的算法
    (1) 克鲁斯卡尔算法
    图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间.
    (2) 普里姆算法
    图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 .


    以下来详细讲下:
    克鲁斯卡尔算法
    方法:将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去.依次选够(n-1)条边,即得最小生成树.(n为顶点数)

    第一步:由边集数组选第一条边

    第二步:选第二条边,即权值为2的边

    第三步:选第三条边,即权值为3的边

    第四步:选第四条边,即权值为4的边

    第五步:选第五条边


    普里姆算法
    方法:从指定顶点開始将它增加集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树的边,并将集合外的那个顶点增加到集合中,表示该顶点已连通.再用集合内的顶点与集合外的顶点构成的边中找最小的边,并将对应的顶点增加集合中,如此下去直到所有顶点都增加到集合中,即得最小生成树.
    例在下图中从1点出发求出此图的最小生成树,并按生成树的边的顺序将顶点与权值填入表中.

    ———————>先写出其邻接矩阵

    第一步:从①開始,①进集合,用与集合外全部顶点能构成的边中找最小权值的一条边
    ①——②权6
    ①——③权1 -> 取①——③边
    ①——④权5

    第二步:③进集合,①,③与②,④,⑤,⑥构成的最小边为
    ①——④权5
    ③——⑥权4 -> 取③——⑥边

    第三步:⑥进集合,①,③,⑥与②,④,⑤构成的各最小边
    ①——②权6
    ③——②权5
    ⑥——④权2 -> 取⑥——④边

    第四步:④进集合,①,③,⑥,④与②,⑤构成的各最小边
    ①——②权6
    ③——②权5 -> 取③——②边
    ⑥——⑤权6

    第四步:②进集合,①,③,⑥,②,④与⑤构成的各最小边
    ②——⑤权3 -> 取②——⑤边


    这也是在网上找到的一个Kruskal和Prim构造过程图,贴出来:

  • 相关阅读:
    Elasticsearch的介绍与安装配置启动问题
    代码发布项目
    gitpython模块
    Paramiko模块
    gojs插件的介绍与使用
    django中如何实现websocket,真正通过websocket实现群聊功能
    如何实现服务端主动给客户端推送消息,websocket详解,以及django如何使用websocket问题
    简单爬取汽车之家新闻(requests模块+bs4)
    http协议版本,响应状态码,正反向代理的区别,与伪静态
    web开发经验——富头像上传编辑器的使用
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3812156.html
走看看 - 开发者的网上家园