POJ 2031 Building a Space Station(最小生成树)
裸Kruskal。注意两个圆想加的时候特判。无奈比赛时,没看懂题意。。求翻译啊。。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 struct node 6 { 7 int sv; 8 int ev; 9 double w; 10 }p[100000]; 11 int o[101]; 12 double x[101],y[101],z[101],r[101]; 13 int num; 14 double sum1; 15 int cmp(const void *a,const void *b) 16 { 17 return (*(struct node *)a).w>(*(struct node *)b).w ? 1:-1; 18 } 19 double judge(int i,int j) 20 { 21 double sum; 22 sum = (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]); 23 if(sqrt(sum) > r[i]+r[j]) 24 return sqrt(sum)-(r[i]+r[j]); 25 else 26 return 0; 27 } 28 int find(int x) 29 { 30 while(x != o[x]) 31 x = o[x]; 32 return x; 33 } 34 void merge(int x,int y,double w) 35 { 36 x = find(x); 37 y = find(y); 38 if(x != y) 39 { 40 o[x] = y; 41 sum1 += w; 42 num ++; 43 } 44 } 45 int main() 46 { 47 int i,j,n,m; 48 while(scanf("%d",&n)!=EOF) 49 { 50 if(!n) break; 51 sum1 = 0; 52 for(i = 1;i <= n;i ++) 53 { 54 scanf("%lf%lf%lf%lf",&x[i],&y[i],&z[i],&r[i]); 55 } 56 num = 0; 57 for(i = 1;i <= n;i ++) 58 o[i] = i; 59 m = 0; 60 for(i = 1;i <= n;i ++) 61 { 62 for(j = 1;j <= i-1;j ++) 63 { 64 if(i != j) 65 { 66 p[m].sv = i; 67 p[m].ev = j; 68 p[m].w = judge(i,j); 69 m ++; 70 } 71 } 72 } 73 qsort(p,m,sizeof(p[0]),cmp); 74 for(i = 0;i <= m-1;i ++) 75 { 76 merge(p[i].sv,p[i].ev,p[i].w); 77 if(num == n-1) 78 break; 79 } 80 printf("%.3lf\n",sum1); 81 } 82 return 0; 83 }