24最小生成树之Prim算法
最小生成树的Prim算法
思想:采用子树延伸法
将顶点分成两类:
生长点——已经在生成树上的顶点
非生长点——未长到生成树上的顶点
使用待选边表:
每个非生长点在待选边表中有一条待选边,一端连着非生长点,另一端连着生长点
步骤:
步骤1)构造初始待选边表,任选一个顶点v作为初始生长点,对其余每个非生长点w(共n-1个),将边(w,v)加进待选边表,如果边(w,v)不存在,则认为边(w,v)的长度是∞。
步骤2)循环n-2遍,非生长点个数k从n-1变到1。
①选择树边。
从待选边表中选出一条最短的待选边(u,v),这里u是非生长点,v是生长点,将(u,v)从待选边表移入生成树的边集,并且将u作为新选出的生长点。
②修改待选边
对剩下的每个非生长点w,比较待选边是(w,x)与边(w,u)的长度,这里x是原有的生长点,u是新选出的生长点,如果(w,u)短于边(w,x),则用(w,u)代替(w,x),作为w的待选边;否则,什么也不做。
示例:
以上为官方图例,如果看不懂可以看下面的世俗图解。。。。。。。。。。。。。。。。
B为生长点,列出所有与B连接点权值。
B |
B |
B |
B |
B |
C |
A |
D |
E |
F |
14 |
4 |
∞ |
20 |
5 |
1.再以权值最小的为生长点,发现B-A的权值最小。A为新的生长点。
及B-A的边确定了。
2.A的为生长点与B原来的边进行比较,若小于原来,就交换。
A-C 8 小于 B-C 交换
A-D 45 小于 B-D 交换
A-E ∞ 大于 B-E 不交换
A-F 3 小于 B-F 交换
B |
A |
A |
B |
A |
A |
C |
D |
E |
F |
4 |
8 |
45 |
20 |
3 |
在以权值最小为生长点。F为新的生长点。
同理,F分别于A原来的权值,进行比较(如上步骤)
B |
A |
A |
A |
F |
A |
F |
C |
D |
E |
4 |
3 |
8 |
45 |
13 |
在以权值最小为生长点。C为新的生长点。
B |
A |
A |
C |
C |
A |
F |
C |
D |
E |
4 |
3 |
8 |
28 |
9 |
在以权值最小为生长点。E为新的生长点。
B |
A |
A |
C |
E |
A |
F |
C |
E |
D |
4 |
3 |
8 |
9 |
10 |
结束。按结点和权值依次画出最小生成树。
注意点:
1.要找准新的生长点(权值最小那个)。
2.找准新生长点后,要以新的生长点与各节点的权值,和原来生长点与各节点点权值,进行足一比较,小于原来的就交换。否则,保持原来的结点和权值。
实现方法分析:
(1)图的边集存储形式
采用邻接数组存储,便于比较边长度,只需存储邻接矩阵的下三角部分(无向加权图)。
(2)待选边表和树边集的存储形式
如上例,待选边表和树边集共用一个长度为n-1的数组存储,元素含3个域:生长点和非生长点名称,边长度。
(3)处理步骤(循环n-2遍)
如上例,每次从当前待选边中选出最短边作树边,换到数组左段的右端,修改剩下的待选边。
Prim算法与Kruskal算法对照:
1)主要思想——都是选短边,但选法不同
Kruskal算法从全图中选短边。
Prim算法从待选边表中选短边。
2)直观性
Kruskal采用子树合并法(直观)
Prim算采用子树延伸法
3)实现的难易程度
Kruskal算法需要判断回路(实现困难些)
Prim算法不需要判断回路
4)时间复杂性
Kruskal算法执行时间主要花费在判断回路,所需时间不超过O(mlogm),m是边数
Prim算法执行时间主要花费在n-2次修改待选边表,其时间耗费用量是O(n2)阶的,n是顶点数
Kruskal算法适用于顶点数较多,而边数较少的情况
Prim算法适用于顶点数较少,而边数较多的情况
24最小生成树之Prim算法的更多相关文章
- C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)
1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...
- 最小生成树一·Prim算法
描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道 ...
- 数据结构与算法--最小生成树之Prim算法
数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...
- 最小生成树的Prim算法
构造最小生成树的Prim算法 假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...
- hihocoder 1097 最小生成树一·Prim算法
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- 算法学习记录-图——最小生成树之prim算法
一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边. 最小生成树:构造连通网的最小代价(最小权值)生成树. prim算法在严蔚敏树上有解释,但是都是数学语言,很 ...
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...
- hihocoder hiho一下 第二十六周 最小生成树一·(Prim算法)
题目1 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥 ...
- 无向图最小生成树(prim算法)
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小.该算法于1930年由捷 ...
随机推荐
- .NET 高性能WEB架构-比较容易改造方式 - .NET架构
下面列出的一些,是我们常见而且比较容易去优化的方式,当然细节方面非常多,仅供参考: 1.数据库依然选择SQL Server数据库(最新的sqlserver功能是很强大的)和使用订阅发布进行单写多读的读 ...
- 生产环境的gitlab大版本升级思路(从7.x升级到8.x)
之前在生产环境部署的gitlab是7.x版本的,提供给公司内部的员工来使用,大概有350个用户左右,gitlab从8.x版本之后内置了CI和CD的集成,所以就考虑到升级版本的问题 通过参考和总结git ...
- Linux下常用命令wget的使用技巧
Linux下wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员 经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...
- jenkins中windows节点设置开机自启动slave-agent
做web UI自动化时,为了提高效率,用了多台windows节点来跑自动化,但slave-agent每次在关机后都得手工启动,麻烦,网上看到了一系列说启动任务中,感觉还是不考虑,这里使用windows ...
- ABP之项目的搭建
ABP是一个非常优秀的框架,使用模块化的管理方式,将当前比较优秀的技术集成到了这个框架中,方便开发者快速搭建自己的网站.作为ABP学习的第一篇,先将ABP框架跑起来看看再说. 1.首先需要去官网下载相 ...
- ELKStack生产案例
需求分析: 访问日志:apache访问日志,nginx访问日志,tomcat file 错误日志: error log,java日志 直接收 java异常需要处理 系统日志:/var/log/* ...
- PAT甲1031 Hello World for U【字符串】
1031 Hello World for U (20 分) Given any string of N (≥5) characters, you are asked to form the chara ...
- poj3417Network【LCA】【树形DP】
Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has jus ...
- ASP.NET MVC中ViewBag和ViewData的区别
在MVC3.0以上我们会用到ViewBag或者ViewData进行页面传值,对比一下二者的差距: ViewData ViewBag 基于key/value的字典集合 dynamic类型对象 从ASP. ...
- tcpdump 学习
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...