题意:在一个三维的奶酪里面有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处理就可以了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }