题目链接: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/