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 }
posted @ 2012-08-11 14:53  Naix_x  阅读(170)  评论(0编辑  收藏  举报