uva 10034 Freckles
最小生成树
#include <cstdio> #include <cstring> #include <cmath> #define INF 1000000000.0 #define N 110 double g[N][N],lowcost[N],x[N],y[N]; int n,cov[N]; double dis(int i , int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=1; i<=n; i++) g[i][i]=INF; for(int i=1; i<=n; i++) for(int j=i+1; j<=n; j++) g[i][j]=g[j][i]=dis(i,j); double sum=0; memset(cov,0,sizeof(cov)); for(int i=1; i<=n; i++) lowcost[i]=g[1][i]; lowcost[1]=0; cov[1]=1; for(int nn=1; nn<n; nn++) { double min=INF; int u=1; for(int i=1; i<=n; i++) if(!cov[i] && lowcost[i]<min) { min=lowcost[i]; u=i; } cov[u]=1; sum+=lowcost[u]; for(int v=1; v<=n; v++) if(!cov[v] && g[u][v]<lowcost[v]) lowcost[v]=g[u][v]; } printf("%.2f\n",sum); if(T) printf("\n"); } return 0; }