最小生成树(Prim算法)

亡梦爱人 提交于 2020-03-12 13:33:10

Prim算法

先选择一个点作为起始,然后每次找权值离这些点最小的,直到所有点找到,此算法如同“生长树”一样,慢慢长大,从1个顶点到n个顶点。

原始图
完成最小生成树
例如:首先选择了1号点开始,每一步都选择离树最近的点相连接,直到连接完毕。

思路:
1.任意选择一点开始构造生成树,并用数组标记那些点已经加入了生成树中
2.在用数组记录生成树到各个顶点的距离,一开始即其他点到这个起始点的距离(2.3.操作类似于Dijkstra算法)
3.从数组中选出离生成树最近的点加入到生成树中,再根据这个点松弛距离数组
4.重复第三步,直到生成树完毕

Prim算法核心代码:

//vis数组标记是否加入生成树,dis数组标记各点到生成树的距离,e为邻接矩阵
while(count<n) {
 min=inf;
 //寻找最近的点,loc记录位置
 for(i=1; i<=n; i++)
  if(vis[i]==0&&dis[i]<min) {
   min=dis[i];
   loc=i;
  }
 vis[loc]=1;
 count++;
 sum+=dis[loc];
 //loc点的所有出边,如果通过loc中转能缩短距离,则松弛
 for(i=1; i<=n; i++)
  if(vis[i]==0&&dis[i]>e[loc][i])
   dis[i]=e[loc][i];
}
  • --未完善堆优化后的Prim算法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!