prim算法适用于在稠密图中求最小生成树,算法流程类似于dijkstra,具体类似每次遍历所有点到当前连通块的距离,选最小距离的点加入连通块,并更新这个点的出边,遍历n次
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int g[N][N],dist[N];
bool st[N];
int n;
//每次找出和连通块距离最近的点(过程类似于dijkstra) 将这个点纳入连通块并用这个点更新他的出边
int prim(){
memset(dist,0x3f,sizeof dist);
dist[1]=0;
int res=0;
for(int i=1;i<=n;i++){
int t=-1;
for(int j=1;j<=n;j++)
if(!st[j]&&(t==-1||dist[j]<dist[t]))
t=j;
st[t]=true;
res+=dist[t];
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],g[t][j]);
}
return res;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g[i][j];
int t=prim();
printf("%d\n",t);
return 0;
}