Prim算法用于稠密图,思想和Dijksra算法类似
使用的贪心思想,找每个点的最小值更新
int q[N],s[M][M],t[N]
cin>>n>>m; //n个点,m个元素
memset(s,0x3f,sizeof s); //点距离先设为最大值
while(m--){
cin>>a>>b>>c;
s[a][b]=s[b][a]=min(s[a][b],c); //无向图邻接矩阵存储
}
int t=prim();
if(t==maxn)puts("不存在");
else cout<<t;
prim算法如下
int prim(){
memset(q,0x3f,sizeof q); //距离最大值
for(int i=0;i<n;i++){ //n次循环
int t=-1; //初值
for(int j=1;j<=n;j++){ //每个点找,找没有标记过的,而且是最小的边
if(!r[j]&&(t==-1||q[t]>q[j])){
t=j;
}
}
if(i&&q[t]==maxn)return maxn; //如果是最大值,说明没找到
if(i)res+=q[t]; //i求最小生成树的边总和
for(int j=1;j<=n;j++){
q[j]=min(q[j],s[t][j]); //边到目前集合的最小值更新
}
r[t]=true; //用过了标记
}
return res; //如果存在就输出总和
}