需要有一個保存節點到當前集合的最短距離的數組,不連通的爲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;
}