[kuangbin带你飞]专题六 最小生成树 C POJ 2031

来源:互联网 发布:淘宝店家可能亏本吗 编辑:程序博客网 时间:2024/06/05 04:04

题目地址:https://vjudge.net/contest/66965#problem/C

思路:最小生成树,模板题,距离即为两个球的圆心距减去半径。

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int maxn=100+10;struct pos{    double x,y,z;}E[maxn*maxn];int fa[maxn];struct point{    double x,y,z,r;}a[maxn];int n;double get(int i,int j){    return 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));}int find(int p){    if(p!=fa[p])        fa[p]=find(fa[p]);    return fa[p];}double cmp(pos a,pos b){    return a.z<b.z;}int main(){    while(scanf("%d",&n) && n)    {        for(int i=0;i<n;i++)        {            cin>>a[i].x>>a[i].y>>a[i].z>>a[i].r;        }        int m=0;        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)        {            if(i==j)                continue;            double temp=get(i,j)-a[i].r-a[j].r;            if(temp<0)                temp=0;            E[m].x=i,E[m].y=j,E[m++].z=temp;        }        sort(E,E+m,cmp);        for(int i=0;i<n;i++)            fa[i]=i;        double ans=0;        for(int i=0;i<m;i++)        {        int x=E[i].x,y=E[i].y;        int fx=find(x);        int fy=find(y);        if(fx!=fy)        {            fa[fx]=fy;            ans+=E[i].z;        }        }        printf("%.3f\n",ans);    }}


0 0