标签:
2 5 0 0 1 0 18 0 0 1 1 1 3 0 0 1 0 0 1
3.00 1.00
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 const int maxn = 55; 7 const int INF = 0x3f3f3f3f; 8 struct Point { 9 int x,y; 10 } p[maxn]; 11 double dis[maxn][maxn],tmp[maxn][maxn],d[maxn]; 12 bool done[maxn]; 13 int n; 14 double prim(){ 15 double ans = 0; 16 for(int i = 0; i < n; ++i){ 17 done[i] = false; 18 d[i] = INF; 19 } 20 d[0] = 0; 21 for(int k = 0; k < n; ++k){ 22 double minV = INF; 23 int idx = 0; 24 for(int i = 0; i < n; ++i) 25 if(!done[i] && minV > d[i]) minV = d[idx = i]; 26 ans += d[idx]; 27 done[idx] = true; 28 for(int i = 0; i < n; ++i) 29 if(!done[i] && d[i] > dis[idx][i]) 30 d[i] = dis[idx][i]; 31 } 32 return ans; 33 } 34 double getDis(int i,int j){ 35 double tmp = (p[i].x - p[j].x)*(p[i].x - p[j].x); 36 tmp += (p[i].y - p[j].y)*(p[i].y - p[j].y); 37 return sqrt(tmp); 38 } 39 int main(){ 40 int T; 41 scanf("%d",&T); 42 while(T--){ 43 scanf("%d",&n); 44 for(int i = 0; i < n; ++i){ 45 scanf("%d %d",&p[i].x,&p[i].y); 46 for(int j = i - 1; j >= 0; --j){ 47 tmp[i][j] = tmp[j][i] = getDis(i,j); 48 } 49 } 50 double ans = INF; 51 for(int i = 0; i < n; ++i){ 52 memcpy(dis,tmp,sizeof(tmp)); 53 for(int j = 0; j < n; ++j) 54 dis[i][j] = dis[j][i] = INF>>1; 55 ans = min(ans,prim()); 56 } 57 printf("%.2f\n",ans-(INF>>1)); 58 } 59 return 0; 60 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4398550.html