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 }

你可能感兴趣的:(Build)