poj 2031

水题,求3维坐标距离,再求最小生成树。

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define INF 1e-8
using namespace std;
typedef struct
{
    double x,y,z,r;
}node;
typedef struct
{
    int x,y;
    double dis;
}bian;
node a[200];
bian b[40000];
int n,bn;
int fa[300];
double dis(int i,int j)
{
    
    double d;
    d = sqrt( (a[i].x-a[j].x)*(a[i].x-a[j].x) + 
              (a[i].y-a[j].y)*(a[i].y-a[j].y) + 
              (a[i].z-a[j].z)*(a[i].z-a[j].z) ) - a[i].r - a[j].r;
    if(d < INF) d = 0;
    //printf("%f\n",a[i].r);
    return d;
}
void init()
{
    for(int i=1;i<=n;i++)
       scanf("%lf %lf %lf %lf",&a[i].x,&a[i].y,&a[i].z,&a[i].r);
    bn = 0;
    for(int i=1;i<=n;i++)
       for(int j=i+1;j<=n;j++)
       {  b[++bn].dis = dis(i,j);
          b[bn].x = i;  b[bn].y = j; 
          
          //printf("%d %d %f\n",i,j,b[bn].dis);
       }
}
int find(int w)
{
    int k;
    if(fa[w] == w) return w;
    k = find(fa[w]);
    fa[w] = k;
    return k;
}
bool cmp(const bian &a,const bian &b)
{
    return a.dis < b.dis;
}
void solve()
{
    int i,j,k,r,w,h;
    double ans;
    sort(b+1,b+bn+1,cmp);
    for(i=1;i<=n;i++) fa[i] = i;
    h = ans = 0;
    for(i=1;i<=bn;i++)
    {  if(h == n-1) break;
       r = find(b[i].x);
       w = find(b[i].y); 
       if( r != w ) 
       {  fa[r] = w;
          h++; 
          ans += b[i].dis;
       }
       //printf("%d %d\n",r,w);
    }
    printf("%0.3f\n",ans);
}
int main()
{
    while(scanf("%d",&n) != EOF && n)
    {  init();
       solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值