对普里姆算法的一点理解
2015-10-28 22:44
246 查看
普里姆算法是构造连通网的最小生成树的算法之一。理解普里姆算法的关键就是要明确两个数组是用来干什么的,这两个数组分别是:lowcost和adjvex。lowcost[j]的意思是顶点j和已经在生成树内的顶点集合内的某个顶点的最小权值。这个已经在生成树内且与顶点j对应的顶点,就记录在adjvex[j]中。把adjvex[j]和lowcost[j]对应起来的意思就是:已经属于生成树的顶点adjvex[j]和未加入生成树的顶点j的组成的边的权值就是lowcost[j]。如下图所示:
![](https://img-blog.csdn.net/20151028231807349?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
之后就是循环计算已经加入生成树中的顶点与未加入生成树的顶点的权值,然后,取出权值最小的顶点加入生成树中,之后再以最新加入的顶点与未加入生成树的邻接点的权值是否小于原先顶点j的权值来更新lowcost数组。例如:原先lowcost[4]的权值是15且顶点4被权值为10的点3抢走了加入生成树的机会(假设点4与点3都与点1相连,且点3与点4相连),若此时,点3与点4的权值小于原来的lowcost[4]的15,比如说是10,那么lowcost[4]的值就会被更新为10,而且adjvex[4]的值也要同时更新为3。如下图所示:
![](https://img-blog.csdn.net/20151028233041664?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
粗略的流程:
①已存在生成树中的顶点:1。未存在生成树中的顶点:2、3、4。此时的lowcost数组的情况:lowcost[1]=0,lowcost[2]=20,lowcost[3]=10,lowcost[4]=15.由此可以判断下一个加入生成树的顶点是顶点3.
②已存在生成树中的顶点:1、3。未存在生成树中的顶点:2、4。此时的lowcost数组的情况:lowcost[1]=0,lowcost[2]=20,lowcost[3]=0,lowcost[4]=10。
这里就出现了上面说的情况,因为在生成树中的顶点目前有顶点1和顶点3,而在顶点3的邻接点集合中且未加入生成树的权值最小的顶点就是顶点4,而顶点4到顶点1的权值明显比3到4要大,所以,这里就需要更新lowcost[4]的值了,并且要修改相对应的adjvex[4]的值。
通过不断的更新lowcost数组的值,和取出lowcost数组的最小值后赋值为0来代表顶点加入生成树来完成生成树的构造。
之后就是循环计算已经加入生成树中的顶点与未加入生成树的顶点的权值,然后,取出权值最小的顶点加入生成树中,之后再以最新加入的顶点与未加入生成树的邻接点的权值是否小于原先顶点j的权值来更新lowcost数组。例如:原先lowcost[4]的权值是15且顶点4被权值为10的点3抢走了加入生成树的机会(假设点4与点3都与点1相连,且点3与点4相连),若此时,点3与点4的权值小于原来的lowcost[4]的15,比如说是10,那么lowcost[4]的值就会被更新为10,而且adjvex[4]的值也要同时更新为3。如下图所示:
粗略的流程:
①已存在生成树中的顶点:1。未存在生成树中的顶点:2、3、4。此时的lowcost数组的情况:lowcost[1]=0,lowcost[2]=20,lowcost[3]=10,lowcost[4]=15.由此可以判断下一个加入生成树的顶点是顶点3.
②已存在生成树中的顶点:1、3。未存在生成树中的顶点:2、4。此时的lowcost数组的情况:lowcost[1]=0,lowcost[2]=20,lowcost[3]=0,lowcost[4]=10。
这里就出现了上面说的情况,因为在生成树中的顶点目前有顶点1和顶点3,而在顶点3的邻接点集合中且未加入生成树的权值最小的顶点就是顶点4,而顶点4到顶点1的权值明显比3到4要大,所以,这里就需要更新lowcost[4]的值了,并且要修改相对应的adjvex[4]的值。
通过不断的更新lowcost数组的值,和取出lowcost数组的最小值后赋值为0来代表顶点加入生成树来完成生成树的构造。
相关文章推荐
- 动易2006序列号破解算法公布
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- 超大数据量存储常用数据库分表分库算法总结
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#数据结构与算法揭秘二
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法
- C#冒泡法排序算法实例分析
- C#实现将数组内元素打乱顺序的方法