UVA 10034 Freckls

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
double map[101][101];
double lis[101][2],mincost[101];
bool vis[101];
int n,pre[101];
inline double getDist(double x1,double y1,double x2,double y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double prim()
{
	memset(vis,0,sizeof vis);
	vis[0]=1;
	for(int i=1;i<n;i++){
		mincost[i]=map[0][i];
		pre[i]=0;
	}
	double sum=0;
	for(int i=0;i<n-1;i++){
		int u=-1;
		for(int j=0;j<n;j++)if(!vis[j]){
			if(u==-1||mincost[j]<mincost[u])
				u=j;
		}
		sum+=map[pre[u]][u];
		vis[u]=1;
		for(int j=0;j<n;j++)if(!vis[j]){
			if(mincost[j]>map[u][j]){
				mincost[j]=map[u][j];
				pre[j]=u;
			}
		}
	}
	return sum;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=0;i<n;i++)
			scanf("%lf%lf",&lis[i][0],&lis[i][1]);
		memset(map,0,sizeof map);
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++)if(i!=j){
				map[i][j]=getDist(lis[i][0],lis[i][1],lis[j][0],lis[j][1]);
			}
		}
		printf("%.2f\n", prim());
		if(T) printf("\n");
	}
	return 0;
}

你可能感兴趣的:(UVA 10034 Freckls)