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算法
来源:CSDN
作者:小菜丶阿岚
链接:https://blog.csdn.net/m0_46531978/article/details/104816033