UVA 1001(p379)----Say Cheese

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值