您的位置:首页 > 其它

UVa 1001 Say Cheese【floyd】

2015-05-09 16:56 417 查看
题意:在一个三维的奶酪里面有n(n<=100)个洞,老鼠A想到达老鼠B的位置,

在洞里面可以瞬间移动,在洞外面的移动速度为10秒一个单位,求最短时间

看到n<=100,又是求最短时间,想到用floyd,可是给的是坐标,,还是三维的,

建不出图来----最后看的题解--------------

是这一篇--
http://morris821028.github.io/2014/11/02/oj/uva/uva-1001/
不懂这种叫不叫离散化,把输入的每个洞编号,

如果两个洞相交,那么d[i][j]=0

如果不相交,那么d[i][j]=dist-(r[i]+r[j]),dist为这两个洞圆心之间的欧几里得距离

再用floyd处理就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=505;

int x[maxn],y[maxn],z[maxn],r[maxn];
double d[maxn][maxn];

int main(){
int n,kase=0;
while(scanf("%d",&n)!=EOF&&n!=-1){
for(int i=1;i<=n+2;i++){
if(i<=n) scanf("%d %d %d %d",&x[i],&y[i],&z[i],&r[i]);
else scanf("%d %d %d",&x[i],&y[i],&z[i]),r[i]=0;
}

n=n+2;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) d[i][j]=0;
else {
double dist=sqrt((double )(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j])+(double)(z[i]-z[j])*(z[i]-z[j]));
if(dist<=r[i]+r[j]) d[i][j]=0;
else d[i][j]=dist-(r[i]+r[j]);
}
}
}

for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

printf("Cheese %d: Travel time = %.0lf sec\n",++kase,d[n-1]
*10);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: