需要有一个保存节点到当前集合的最短距离的数组,不连通的为max
在搜索的循环内
1.循环所有点,找出与当前集合距离最短的点,设置当前点为该点,设置该点访问过
2.循环所有点,将未访问过的点与当前最短距离和新点的最短距离比较,更新数组
代码:
int prim(int n)
{
initialize(visit,false,n);
int low[POINTNUM];//当前集合到各个顶点的距离的最短值
int newpoint;//当前需要搜索的点,即集合新增的点
int sum=0;//最终结果
int min;//临时最小值
newpoint=0;//当前点初始化为编号0
visit[0]=1;//0点已加入集合
for(int i=0;i<n;i++)
low[i]=map[newpoint][i];//将当前集合(0点)到其他所有点的权值赋值到low里面
for(int i=1;i<n;i++)//开始搜索,总共需要搜索n-1次
{
min=INT_MAX;
for(int j=0;j<n;j++)//搜索与当前集合距离最短的点
{
if(visit[j]==0 && min>low[j])//被搜索到的点还没在集合里,该点到当前集合的距离是存在的且足够短
{
min=low[j];
newpoint=j;
}
}
sum+=min;
visit[newpoint]=1;
for(int j=0;j<n;j++)//为集合新增的点添加满足条件的权值
if(visit[j]==0)
{
if(low[j]>map[newpoint][j]) low[j]=map[newpoint][j];
}
}
return sum;
}