版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/westbrook1998/article/details/83476066
hiho1097
Prim和Dijkstra很像,这里也是用邻接矩阵存的,应该也能改成堆优化的吧,然后就是松弛条件那里和dijk不一样
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+50;
const int INF=0x3f3f3f3f;
int n;
int cost[N][N];
int dis[N];
bool vis[N];
int Prim(){
int ans=0;
memset(vis,false,sizeof(vis));
vis[0]=true;
for(int i=1;i<n;i++){
dis[i]=cost[0][i];
}
for(int i=1;i<n;i++){
int Min=INF;
int k=-1;
for(int j=0;j<n;j++){
if(!vis[j] && Min>dis[j]){
k=j;
Min=dis[j];
}
}
if(k==-1){
//不连通
return -1;
}
ans+=Min;
vis[k]=true;
for(int j=0;j<n;j++){
if(!vis[j] && dis[j]>cost[k][j]){
dis[j]=cost[k][j];
}
}
}
return ans;
}
int main(void){
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&cost[i][j]);
}
}
int ans=Prim();
printf("%d\n",ans);
return 0;
}