UVa 1001 Say Cheese【floyd】

题意:在一个三维的奶酪里面有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处理就可以了

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
14 
15 typedef long long LL;
16 const int INF = (1<<30)-1;
17 const int mod=1000000007;
18 const int maxn=505;
19 
20 int x[maxn],y[maxn],z[maxn],r[maxn];
21 double d[maxn][maxn];
22 
23 int main(){
24     int n,kase=0;
25     while(scanf("%d",&n)!=EOF&&n!=-1){
26         for(int i=1;i<=n+2;i++){
27             if(i<=n) scanf("%d %d %d %d",&x[i],&y[i],&z[i],&r[i]);
28             else scanf("%d %d %d",&x[i],&y[i],&z[i]),r[i]=0;
29         }
30         
31         n=n+2;
32         for(int i=1;i<=n;i++){
33             for(int j=1;j<=n;j++){
34                 if(i==j) d[i][j]=0;
35                 else {
36                     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]));
37                     if(dist<=r[i]+r[j]) d[i][j]=0;
38                     else d[i][j]=dist-(r[i]+r[j]);
39                 }
40             }
41         }
42         
43         
44         for(int k=1;k<=n;k++)
45          for(int i=1;i<=n;i++)
46           for(int j=1;j<=n;j++)
47           d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
48          
49          printf("Cheese %d: Travel time = %.0lf sec
",++kase,d[n-1][n]*10);
50     }
51     return 0;    
52 }
View Code
原文地址:https://www.cnblogs.com/wuyuewoniu/p/4490671.html