#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=200;
const double inf=9999999999.0;
double g[maxn][maxn],ans;
int n,x[maxn],y[maxn],z[maxn],ans1;
int x1,x2,yy1,y2,z1,z2,r[maxn],ans2;
void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j]=inf;
}
void prepare()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
double dist=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]));
if(dist-r[i]-r[j]<=0) {g[i][j]=0;g[j][i]=0;}
else {g[i][j]=dist-r[i]-r[j];g[j][i]=dist-r[i]-r[j];}
}
}
void floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i!=j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
void f()
{
ans=inf;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
double temp1=sqrt((x[i]-x1)*(x[i]-x1)+(y[i]-yy1)*(y[i]-yy1)+(z[i]-z1)*(z[i]-z1))-r[i];
double temp2=sqrt((x[j]-x2)*(x[j]-x2)+(y[j]-y2)*(y[j]-y2)+(z[j]-z2)*(z[j]-z2))-r[j];
if(temp1<0) temp1=0;if(temp2<0) temp2=0;
ans=min(ans,temp1+temp2+g[i][j]);
// cout<<i<<" "<<j<<" "<<temp1<<" "<<temp2<<" "<<temp1+temp2<<" "<<ans<<" "<<g[i][j]<<endl;
}
double dist=sqrt((x1-x2)*(x1-x2)+(yy1-y2)*(yy1-y2)+(z1-z2)*(z1-z2));
ans=min(ans,dist)*10;
}
int main()
{
//freopen("in.in","r",stdin);
int cas=0;
while(scanf("%d",&n)!=EOF&&(n!=-1))
{
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&x[i],&y[i],&z[i],&r[i]);
scanf("%d%d%d",&x1,&yy1,&z1);
scanf("%d%d%d",&x2,&y2,&z2);
init();
prepare();
floyd();
f();
cas++;
printf("Cheese %d: Travel time = %.0lf sec\n",cas,ans);
}
return 0;
}
UVA 1001(p379)----Say Cheese
最新推荐文章于 2018-10-02 10:50:25 发布