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

 

Sample Input
3
10.000 10.000 50.000 10.000
40.000 10.000 50.000 10.000
40.000 40.000 50.000 10.000
2
30.000 30.000 30.000 20.000
40.000 40.000 40.000 20.000
5
5.729 15.143 3.996 25.837
6.013 14.372 4.818 10.671
80.115 63.292 84.477 15.120
64.095 80.924 70.029 14.881
39.472 85.116 71.369 5.553
0

Sample Output
20.000
0.000
73.834

 

最小生成树模板题

题意:

空间站是有一些球状的房间组成的,现在有一些房间但是没有相互连接,你需要设计一些走廊使他们都相通,当然,有些房间可能会有重合(很神奇的样子,重合距离是0),你需要设计出来最短的走廊使所有的点都连接。

*:给的是点坐标,注意构图时,仍需要搭建的距离是 两圆心距减去两圆半径

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stack>
  6 #include<math.h>
  7 #include<queue>
  8 using namespace std;
  9 #define INF 0x3f3f3f3f
 10 #define N 12342
 11 
 12 int n;
 13 int vis[N];
 14 double Map[120][120],dist[N];
 15 
 16 struct node
 17 {
 18     double x,y,z,r;
 19 }p[N];
 20 
 21 double Len(node a,node b)///仍要搭建的距离
 22 {
 23     double x=a.x-b.x;
 24     double y=a.y-b.y;
 25     double z=a.z-b.z;
 26     double l=sqrt(x*x+y*y+z*z)-a.r-b.r;
 27 
 28     if(l<0)
 29         l=0;
 30 
 31     return l;
 32 }
 33 
 34 void Init()
 35 {
 36     for(int i=0;i<=n;i++)
 37     {
 38         for(int j=0;j<=n;j++)
 39         Map[i][j]=(i==j)?0:INF;
 40 
 41         dist[i]=INF;
 42         vis[i]=0;
 43     }
 44 }
 45 
 46 double Prim(int s)
 47 {
 48     vis[s]=1;
 49 
 50     for(int i=1;i<=n;i++)
 51         dist[i]=Map[s][i];
 52 
 53     double sum=0.0;
 54 
 55     for(int i=1;i<n;i++)
 56     {
 57        double Min=INF;
 58        int index=-1;
 59 
 60         for(int j=1;j<=n;j++)
 61         {
 62             if(!vis[j]&&Min>dist[j])
 63             {
 64                 Min=dist[j];
 65                ///printf("%lf\n", Min);
 66                 index=j;
 67             }
 68         }
 69         sum+=Min;
 70         ///printf("%lf\n", sum) ;
 71 
 72         vis[index]=1;
 73 
 74         for(int j=1;j<=n;j++)
 75             if(!vis[j]&&dist[j]>Map[index][j])
 76             dist[j]=Map[index][j];
 77     }
 78     return sum;
 79 }
 80 
 81 int main( )
 82 {
 83     while(scanf("%d", &n), n)
 84     {
 85         Init();
 86 
 87         for(int i=1;i<=n;i++)
 88             scanf("%lf%lf%lf%lf", &p[i].x,&p[i].y,&p[i].z,&p[i].r);
 89 
 90         ///记录各细胞间还需搭建的距离
 91         for(int i=1;i<=n;i++)
 92         {
 93             for(int j=i+1;j<=n;j++)
 94             {
 95                 Map[i][j]=Map[j][i]=Len(p[i],p[j]);
 96                ///printf("%d %d %lf\n", i,j,Map[i][j]);
 97             }
 98         }
 99 
100         double ans=Prim(1);
101 
102         printf("%.3f\n", ans);
103     }
104     return 0;
105 }

 

本人博客:http://www.cnblogs.com/weiyuan/

posted on 2016-07-16 14:57  惟愿。。。  阅读(125)  评论(0编辑  收藏  举报