<题目链接>
题目大意:
给你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 = 105; int n,mpa[N][N],vis[N],dis[N*N]; void Prim(){ long long sum=0; memset(vis,0,sizeof(vis)); int cur=1;vis[cur]=1; REP(i,2,n)dis[i]=mpa[cur][i]; REP(i,2,n){ int mn=INF,loc; REP(j,1,n){ if(!vis[j]&&mn>dis[j]){ mn=dis[j]; loc=j; } } sum+=mn; vis[loc]=1; REP(j,1,n){ if(!vis[j]&&dis[j]>mpa[loc][j]) dis[j]=mpa[loc][j]; } } printf("%lld ",sum); } int main(){ while(~scanf("%d",&n)){ memset(mpa,INF,sizeof(mpa)); REP(i,1,n) REP(j,1,n){ cin>>mpa[i][j]; } Prim(); } }