zoukankan      html  css  js  c++  java
  • POJ


    题目链接: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
    ", Min);
     66                 index=j;
     67             }
     68         }
     69         sum+=Min;
     70         ///printf("%lf
    ", 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
    ", i,j,Map[i][j]);
     97             }
     98         }
     99 
    100         double ans=Prim(1);
    101 
    102         printf("%.3f
    ", ans);
    103     }
    104     return 0;
    105 }

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

  • 相关阅读:
    Java堆栈内存总结
    Java String使用总结
    Java异常处理
    音乐之声——midi制作原理
    Windows使用问题总结
    Chrome浏览器的使用
    搭建svn服务器
    Windows实用快捷键
    Phone文件备份
    9大背包第一弹 | 01背包
  • 原文地址:https://www.cnblogs.com/weiyuan/p/5676396.html
Copyright © 2011-2022 走看看