生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树。求最小造价的过程也就转化成求最小生成树的过程,则最小生成树表示使其造价最小的生成树。

那么怎么样用普利姆算法(prim算法)求最小生成树(MST)?

本文以图例方式详述prim算法求最小生成树过程,希望对大家有帮助!

相关概念

带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。

最小生成树(MST):权值最小的生成树。

生成树和最小生成树的应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价,则最小生成树表示使其造价最小的生成树。

最小生成树的性质

MST性质:假设G=(V,E)是一个连通网,U是顶点V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。

构造网的最小生成树必须解决下面两个问题:
(1)尽可能选取权值小的边,但不能构成回路;
(2)选取n-1条恰当的边以连通n个顶点;

普利姆算法(prim算法)基本思想

prim算法基本思想:

假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作:

在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。

此时,TE中必有n-1条边,T=(V,TE)为G的最小生成树。

Prim算法的核心:始终保持TE中的边集构成一棵生成树。

看了上面一大段文字是否感觉有点晕?为了便于大家更好的理解,接下来进行算法过程的分步图解!

普利姆求最小生成树算法过程图解


第一步:随意选取起点

图中有9个顶点v1-v9,集合表示为:V={v1,…,V9},每条边的边权值都在图上;在进行prim算法时,我们先随意选择一个顶点作为起始点(起始点的选取不会影响最小生成树结果),在此我们一般选择v1作为起始点,现在我们设U集合为当前所找到最小生成树里面的顶点,TE集合为所找到的边。

状态如下:U={v1}; TE={};

第二步:在前一步的基础上寻找最小权值

查找一个顶点在U={v1}集合中,另一个顶点在V-U集合中的最小权值,如下图,在红线相交的线上找最小值。

通过图中我们可以看到边v1-v8的权值最小为2,那么将v8加入到U集合,(v1,v8)加入到TE。

状态如下:U={v1,v8}; TE={(v1,v8)};

第三步:继续寻找最小权值

查找一个顶点在U={v1,v8}集合中,另一个顶点在V-U集合中的最小权值,如下图,在红线相交的线上找最小值。

通过图中我们可以看到边v8-v9的权值最小为4,那么将v9加入到U集合,(v8,v9)加入到TE。

状态如下:U={v1,v8,v9}; TE={(v1,v8),(v8,v9)};

第四步:在前一步的基础上,继续寻找最小权值

查找一个顶点在U={v1,v8,v9}集合中,另一个顶点在V-U集合中的最小权值,如下图,在红线相交的线上找最小值。

通过图中我们可以看到边v9-v2的权值最小为1,那么将v2加入到U集合,(v9,v2)加入到TE。

状态如下:U={v1,v8,v9,v2};

TE={(v1,v8),(v8,v9),(v9,v2)};

第五步:继续在前一步的基础上,寻找最小权值

查找一个顶点在U={v1,v8,v9,v2}集合中,另一个顶点在V-U集合中的最小权值,如下图,在红线相交的线上找最小值。

通过图中我们可以看到边v2-v3的权值最小为3,那么将v3加入到U集合,(v2,v3)加入到TE。

状态如下:U={v1,v8,v9,v2,v3};

TE={(v1,v8),(v8,v9),(v9,v2),(v2,v3)};

第五~九步:继续在前一步的基础上,寻找最小权值

如此循环一下直到找到所有顶点为止。到这大家应该对普利姆算法求解最小生成树的过程有所知晓,但需注意以下三点:

(1)每次都选取权值最小的边,但不能构成回路,构成环路的边则舍弃。如图中的(v1,v9),(v1,v2)等构成回路舍弃

(2)遇到权值相等,又均不构成回路的边,随意选择哪一条,均不影响生成树结果。如图中的(v3,v4),(v6,v5)权值均为9,选择哪一条在先均不影响最小生成树的生成结果。

(3)选取n-1条恰当的边以连通n个顶点。

完整的算法步骤如图所示:

总结

(1)最小生成树(MST)是指权值最小的生成树。

(2)prim算法是求最小生成树的算法之一,其他算法还有kruskal算法

(3)其时间复杂度为O(n^2),与边得数目无关,prim算法适合稠密图

本文摘自:
普利姆算法(prim)求最小生成树(MST)过程详解

好家伙,随手就是一个赞~


给作者买瓶咖啡提提神~

我的视频课

下面是我录制的一些视频课,欢迎大家围观~

《Android性能优化参考》

本课程包含了Android中的App启动优化、UI优化、内存优化、图片优化、耗电量等常见的性能优化场景,通过学习此课程,你将对整个Android性能优化体系有清晰的认识。

性能优化作为Android高级开发的必备技能,也是大厂面试必考的题目,是体现一个人技术深度最好的试金石。

《面试之排序算法》

排序算法是我们面试被问到最多的基础算法,本课程详细介绍了七种排序算法,包括插入排序、选择排序、冒泡排序、谢尔排序、快速排序、堆积排序和二路并归排序。每种算法都详细介绍了核心思想、详细步骤、时间复杂度和代码实现,希望帮助大家深入理解排序算法,搞定面试!

《Android HyBrid App开发实战》

本课程为Android HyBrid App开发实战课程,由浅入深,从三种App的历史和特点开始,介绍了Android WebView的使用、Java和JS交互的原生方式、著名的WebView安全漏洞、JSBridge的原理和使用,最后通过一个网上商城的实战综合全部内容,让同学们掌握并深入理解Android HyBrid App开发。

《AI导论》

介绍人工智能AI的诞生历史和到现在为止的不同发展阶段;介绍了AI领域中常见的名词概念和其关系,包括机器学习、深度学习、神经网络结构搜索 NAS、生成对抗网络 GAN等;最后对AI发展做出展望。
本课程属于导论课程,旨在帮助同学们从宏观层面把握AI,建立AI的知识体系。

《Java注解精讲》

本课程详细介绍了Java中的注解机制,包括注解的定义和分类,注解的使用和自定义,注解的源码和架构分析;
本课程语言简单凝练,视频短小精悍,让你一次彻底搞懂Java注解!

《Java反射精讲》

反射是Java中重要的也是较难理解的内容;
本课程从反射的定义、作用、原理和使用出发,全方位帮你彻底搞定反射;

普利姆算法(prim)求最小生成树(MST)过程详解相关推荐

  1. Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)

    1.Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal) 普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)求**最小生成树(极小连通子图)**的算法 1.1普利姆算法(Prim) ...

  2. 数据结构与算法-普利姆算法(Prim) | 尚硅谷韩顺平

    最小生成树 给定一个带权无向连通图,选取一棵树,让树所有边上权的总和最小,叫最小生成树 N个顶点,一定有N-1条边 包含全部顶点 N-1条边都要在图中 算法介绍 普里姆算法求最小生成树,也就是在包含n ...

  3. 普利姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

    普利姆算法就是求出最小生成树的算法之一 最小生成树:给定一个大权的无向连接图如何选取一颗生成树,使树上的所有边上权的总和为最小,这就叫做最小生成树 例子: 用Prim算法从p城出发 求出生成树: 结果 ...

  4. 最小生成树算法普利姆算法和克鲁斯卡尔算法实现

    最小生成树算法: 普里姆算法:顶点集合N,辅助顶点集合S,初始化中,将出发点vi加入S,并从N中删除 1.从顶点集合N中找到一条到集合S最近的边(vi,vj),存储该边,并将vj从N移到S中 2.重复 ...

  5. Day595.普利姆算法 -数据结构和算法Java

    普利姆算法 一.问题引出 二.最小生成树 三.普利姆算法介绍 四.图解分析 五.代码实现 package com.achang.algorithm;import java.util.Arrays;/* ...

  6. Prim Algorithm(普利姆算法)

    Prim算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权 ...

  7. 普利姆算法和克鲁斯卡尔算法求解最小生成树

    Q:最小生成树有什么用? A:譬如我要去五个城市旅游,每两个城市之间可能有路也可能没有,路的距离可能一样也可能不一样,随机从一个城市出发,我想要把每个城市走一遍,怎么样走过的路距离最短,比如我想从上海 ...

  8. 普利姆算法(prim)---(韩顺平数据结构)笔记

    普利姆算法 本质:求出从某一结点开始到达其他结点距离花费最少的组合 从图中指定顶点出发,寻找它相连的所有结点,比较这些结点的权值大小,然后连接权值最小的那个结点. 然后将寻找这两个结点相连的所有结点, ...

  9. [算法]最小生成树-普利姆算法

    2019独角兽企业重金招聘Python工程师标准>>> 目前正在看<大话数据结构>,其中介绍了普利姆算法,自己对算法理解能力太差,能够手写求出最小生成树,但是写出算法代码 ...

最新文章

  1. 芯盾时代:致力于身份认证安全的领军者
  2. PyTorch模块类
  3. 使用字符串切割,使手机号中间四位隐藏
  4. linux内核模块实验,linux内核模块实验(2学时).doc
  5. Distances to Zero CodeForces - 803B (二分)
  6. hack wifi android,WiFi Hack AIO 2010 - WiFi v1.2
  7. amplify color_如何使用Amplify监视Nginx
  8. 内存分配失败错误处理
  9. SPring cloud (3)A Ribbon 负载均衡 配置初步
  10. GCC、VS对C++标准的支持情况总结(转载)
  11. AI智能电话机器人源码搭建揭秘!语音机器人电销机器人源码系统那些事
  12. Android水平仪实训报告,测量实训报告【三篇】
  13. 计算机键盘怎么输入平方,word里平方2怎么打_在word里输入㎡符号的方法
  14. 如何预防 CSRF 攻击?
  15. Docker容器化开发
  16. prometheus-community-PushProx介绍
  17. transition(过渡)
  18. 计算机与艺术传媒用英语怎么说,经济学人:艺术评论和计算机 数字图画
  19. 精美Bootstrap二手物品交易市场模板Html
  20. 网络基础——IP地址子网掩码MAC地址DNS(详解)

热门文章

  1. [Go] 解决 imported from implicitly required module
  2. python初学者:求车牌号码最后一位数字字符
  3. [AHOI2002]哈利·波特与魔法石
  4. srvctl命令详解
  5. oracle 登陆 选项无效,srvctl 命令选项无效
  6. 西工大数计算机辅助设计,西工大《计算机辅助设计》作业机考参考答案.docx
  7. Python知识训练-序列结构
  8. 高危!Windowsnbsp;ANI漏洞官方补丁下载
  9. 中国“红客联盟”有多厉害?一场大决战,攻占美国1600多个网站!
  10. 使用vconsole进行手机端调试