图的最小生成树prim算法详解

prim算法是求图的最小生成树的一种算法,它是根据图中的节点来进行求解,具体思想大概如下: 首先,将图的所有节点(我们假定总共有n个节点)分成两个集合,V和U。其中,集合V保存的是我们已经访问过的节点,集合U保存的是我们未曾访问的节点。prim算法第一步就是选定第一个节点放入集合V中(一般是第一个),然后查找V中节点和U中节点之间距离最小的那个路径,(假设U中节点w离V中的某个节点距离最近),将w
摘要由CSDN通过智能技术生成

prim算法是求图的最小生成树的一种算法,它是根据图中的节点来进行求解,具体思想大概如下:
首先,将图的所有节点(我们假定总共有n个节点)分成两个集合,V和U。其中,集合V保存的是我们已经访问过的节点,集合U保存的是我们未曾访问的节点。prim算法第一步就是选定第一个节点放入集合V中(一般是第一个),然后查找V中节点和U中节点之间距离最小的那个路径,(假设U中节点w离V中的某个节点距离最近),将w放入V中,将w从U中删除,这样,直到U中所有节点都被放入V中,那么我们就找到了最小生成树。
因为prim算法每一步都需要遍历集合V和集合U中的所有节点,其时间复杂度为O(n*n),这是未经任何优化的prim算法时间复杂度。
一般,我们要对该算法进行优化,我们维护一个数组low[n],用来保存到每个节点的已知的最短路径是多少,例如,我们有图如下:这里写图片描述
首先,我们选定v1作为我们的初始节点,这时,low数组的大小分别为:
low[1] = 0;
low[2] = 6;
low[3] = 1;
low[4] = 5;
low[5] = INF;
low[6] = INF;
因为5和6从1无法到达,所以设定为无穷大。
此时,集合V中有节点{V1},集合U中有节点{V2,V3,V4, V5,V6},此时,通过条件判断,我们可以找到节点3离V1最近(通过low数组),然后,我们将节点V3放入集合V中,并从U中删除它,此时
集合V= {V1,V3}
集合U={V2,V4,V5,V6}
这时,我们需要对low数组进行更新。前面讲过,low数组是保存的我们已知的点到剩余节点的最短距离,因为此时V3加入了已知点集,所以需要根据V3到其它节点的距离进行更新;
low[1] = 0;//因为节点V1已经被访问过,所以不需要更新
low[2] = 5;//因为从节点V3到节点V2的距离为5,比上一个数据low[2] = 6要小,因此需要更新;
low[3] = 1;//因为节点V3已经被访问过,所以不需要更新;
low[4] = 5;//因为从节点V3到V4的距离和上一个数据low[4]=5一样,我们不更新;
low[5] = 6;//很明显,此时V3到V5的距离要比上一个数据low[5]=INF来的小,我们进行更新;
low[6] = 4;//道理同low[5];
此时,我们对low数组进行更新完毕,这样,下次就可以继续通过low数组来查找最距

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值