您的位置:首页 > 产品设计 > UI/UE

poj 2031 Building a Space Station(prime )

2013-11-05 20:46 155 查看
这个题要交c++, 因为prime的返回值错了,改了一会

题目:http://poj.org/problem?id=2031

题意:就是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通。如果两个球有重叠的部分则算为已连通,无需再搭桥。求搭建通路的最小费用(费用就是边权,就是两个球面之间的距离

思路:求球之间的距离, 距离小于半径 说明联通 , 距离为0.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double const INF=1<<29;
double G[110][110];

struct node
{
double x,y,z,r;
}p[110];
double prime(int n)
{
double sum=0.0;
int i,j,pos;
int v[110]={0};
double d[110],min;
for(i=1; i<=n; i++)
d[i]=G[1][i];
v[1]=1;
for(i=2; i<=n; i++)
{
min=INF;
for(j=1; j<=n; j++)
{
if(!v[j]&&min>d[j])
{
min=d[j];
pos=j;
}
}
sum+=min;
v[pos]=1;
//printf("%.3lf  %.3lf\n",min,sum);
for(j=1; j<=n; j++)
{
if(!v[j])
{
if(d[j]>G[pos][j])
d[j]=G[pos][j];
}
}
//printf("%.3lf  %.3lf\n",min,sum);
}
//printf("%.3lf\n",sum);
return sum;
}
int main()
{
int n,i,j;
double d,sum;
while(scanf("%d",&n)&&n)
{
memset(p,0,sizeof(p));
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
G[i][j]=INF;
G[i][i]=0;
}
for(i=1; i<=n; i++)
{
scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z,&p[i].r);
for(j=1; j<i; j++)
{
d=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)
+(p[i].z-p[j].z)*(p[i].z-p[j].z));
if(d-p[i].r-p[j].r<=0)
G[i][j]=G[j][i]=0;
else
G[i][j]=G[j][i]=d-p[i].r-p[j].r;
}
}
sum=prime(n);
printf("%.3lf\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: