O ( N*N )
适合于 稠密图
还没有用heap优化的代码:
int map[n][n],dis[n];
bool visit[n];
int prim(){
int i,j,k,min,ans;
memset(dis,INF,sizeof(dis));
memset(visit,false,sizeof(visit));
dis[1]=0;
ans=0;
for(i=1;i<=n;i++){
min=INF;
for(j=1;j<=n;j++)
if(!visit[j]&&min>dis[j]){
min=dis[j];
k=j;
}
if(min==INF)return -1; // 无法联通
ans+=min;
visit[k]=true;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j]>map[k][j])
dis[j]=map[k][j];
}
return ans;
}