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\n",++kase,d[n-1][n]*10);

50     }

51     return 0;    

52 }
View Code

 

你可能感兴趣的:(floyd)