对普里姆算法的一点理解

来源:互联网 发布:java 字符串转换字节 编辑:程序博客网 时间:2024/06/08 08:27

普里姆算法是构造连通网的最小生成树的算法之一。理解普里姆算法的关键就是要明确两个数组是用来干什么的,这两个数组分别是:lowcost和adjvex。lowcost[j]的意思是顶点j和已经在生成树内的顶点集合内的某个顶点的最小权值这个已经在生成树内且与顶点j对应的顶点,就记录在adjvex[j]中。把adjvex[j]和lowcost[j]对应起来的意思就是:已经属于生成树的顶点adjvex[j]和未加入生成树的顶点j的组成的边的权值就是lowcost[j]如下图所示:


之后就是循环计算已经加入生成树中的顶点与未加入生成树的顶点的权值,然后,取出权值最小的顶点加入生成树中,之后再以最新加入的顶点与未加入生成树的邻接点的权值是否小于原先顶点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来代表顶点加入生成树来完成生成树的构造。

0 0
原创粉丝点击