码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2031 Building a Space Station

时间:2014-07-06 09:00:42      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:最小生成树

最小生成树问题。

空间坐标系,还有点的半径。

如果两个点距离减去它们的半径小于0,表明他们重叠了。直接并查集合并。


剩下的就排序,并查。

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
struct lx
{
    int u,v;
    double len;
} l[50*101];
int fa[101];
struct node
{
    double x,y,z,r;
}point[101];


bool cmp(const lx &a,const lx &b)
{
    return a.len<b.len;
}
int father(int x)
{
    if(x!=fa[x])
        return fa[x]=father(fa[x]);
}
double getlen(node a,node b)
{
    double len=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2));
    return len-a.r-b.r;
}


int main()
{
    while(scanf("%d",&n),n)
    {
        for(int i=1;i<=n;i++)
        {
            fa[i]=i;
            scanf("%lf%lf%lf%lf",&point[i].x,&point[i].y,&point[i].z,&point[i].r);
        }
        int cot=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                double len=getlen(point[i],point[j]);
                if(len<=0)
                {
                    int fi=father(i);
                    int fj=father(j);
                    if(fi==fj)continue;
                    fa[fj]=fi;
                }
                else
                {
                    l[cot].u=i,l[cot].v=j;
                    l[cot++].len=len;
                }
            }
        }
        sort(l,l+cot,cmp);

        double ans=0;
        for(int i=0;i<cot;i++)
        {
            int fu=father(l[i].u);
            int fv=father(l[i].v);
            if(fu==fv)continue;
            fa[fv]=fu;
            ans+=l[i].len;
        }
        printf("%.3f\n",ans);
    }
}


POJ 2031 Building a Space Station,布布扣,bubuko.com

POJ 2031 Building a Space Station

标签:最小生成树

原文地址:http://blog.csdn.net/dongshimou/article/details/36915987

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!