<题目链接>
题目大意:
给你N*N矩阵,表示N个村庄之间的距离。FJ要把N个村庄全都连接起来,求连接的最短距离(即求最小生成树)。
解题分析:
Prim模板题,类似于这种完全图的情况下,用Prim求最小生成树较Kruskal更优一点。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; #define REP(i,s,t) for(int i=s;i<=t;i++)
const int INF = 0x3f3f3f3f;
const int N = ;
int n,mpa[N][N],vis[N],dis[N*N]; void Prim(){
long long sum=;
memset(vis,,sizeof(vis));
int cur=;vis[cur]=;
REP(i,,n)dis[i]=mpa[cur][i];
REP(i,,n){
int mn=INF,loc;
REP(j,,n){
if(!vis[j]&&mn>dis[j]){
mn=dis[j];
loc=j;
}
}
sum+=mn;
vis[loc]=;
REP(j,,n){
if(!vis[j]&&dis[j]>mpa[loc][j])
dis[j]=mpa[loc][j];
}
}
printf("%lld\n",sum);
} int main(){
while(~scanf("%d",&n)){
memset(mpa,INF,sizeof(mpa));
REP(i,,n) REP(j,,n){
cin>>mpa[i][j];
}
Prim();
}
}