思想:蓝白点。未加入生成树的点标记为蓝点,加入生成树的点标记为白点。
每次循环找到当前离白点集团最近的蓝点,加入最小生成树(标记为白点)。
更新每个蓝点到白点集团的最小值。
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n,i,j;
int e[101][101];
int minn[101];
bool u[101];
int ans=0;
memset(minn,0x7f,sizeof(minn));//将最小值设置为maxint
minn[1]=0;//这样设置是为了第一次循环把1加入生成树
memset(u,1,sizeof(u));//将所有点设置为蓝点(标记为未加入最小生成树)
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>e[i][j];//构造邻接矩阵
int k;
for(i=1;i<=n;i++){
k=0;
for(j=1;j<=n;j++)
if(u[j]&&minn[j]<minn[k])
{k=j;}//找出当前离白点集团最近的蓝点
u[k]=0;//将这个蓝点加入白点集团
for(j=1;j<=n;j++)
if(u[j]&&e[k][j]<minn[j]){
minn[j]=e[k][j];//更新每个蓝点到白点集团的最小值
}
}
for(i=1;i<=n;i++){
ans+=minn[i];
}
cout<<ans;
return 0;
}