POJ-2031 Building a Space Station 最小生成树

  题目链接:http://poj.org/problem?id=2031

  很典型的最小生成树题目。

 1 //STATUS:C++_AC_0MS_252KB
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<iostream>
 7 #include<string>
 8 #include<algorithm>
 9 #include<vector>
10 #include<queue>
11 #include<stack>
12 using namespace std;
13 #define LL __int64
14 #define pii pair<int,int>
15 #define Max(a,b) ((a)>(b)?(a):(b))
16 #define Min(a,b) ((a)<(b)?(a):(b))
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define lson l,mid,rt<<1
19 #define rson mid+1,r,rt<<1|1
20 const int N=110,M=1000000,INF=0x3f3f3f3f,MOD=1999997;
21 const LL LLNF=0x3f3f3f3f3f3f3f3fLL;
22 const double DNF=100000000;
23 
24 struct Node{
25     double x,y,z,r;
26 }nod[N];
27 double w[N][N],d[N];
28 int vis[N];
29 int n;
30 
31 inline double dist(Node &a,Node &b)
32 {
33     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)
34                 +(a.z-b.z)*(a.z-b.z));
35 }
36 
37 double mintree()
38 {
39     int i,j,x;
40     double m,ans=0;
41     for(i=0;i<n;i++)d[i]=DNF;
42     d[0]=0;
43     mem(vis,0);
44     for(i=0;i<n;i++){
45         m=DNF;
46         for(j=0;j<n;j++)if(d[j]<m && !vis[j])m=d[x=j];
47         vis[x]=1;
48         ans+=d[x];
49         for(j=0;j<n;j++){
50             if(w[x][j]<d[j] && !vis[j])
51                 d[j]=w[x][j];
52         }
53     }
54     return ans;
55 }
56 
57 int main()
58 {
59  //   freopen("in.txt","r",stdin);
60     int i,j;
61     double t;
62     while(~scanf("%d",&n) && n)
63     {
64         for(i=0;i<n;i++)
65             for(j=0;j<n;j++)w[i][j]=DNF;
66         for(i=0;i<n;i++)
67             scanf("%lf%lf%lf%lf",&nod[i].x,&nod[i].y,&nod[i].z,&nod[i].r);
68         for(i=0;i<n;i++){
69             for(j=i;j<n;j++){
70                 t=dist(nod[i],nod[j])-nod[i].r-nod[j].r;
71                 w[i][j]=w[j][i]=t>0?t:0;
72             }
73         }
74 
75         printf("%.3lf\n",mintree());
76     }
77     return 0;
78 }

 

posted @ 2013-01-20 02:05  zhsl  阅读(210)  评论(0编辑  收藏  举报