UVA 1001 floyd

题意:三维空间中有n个洞,告诉圆心以及半径,以及起点和终点,求最短路径长度。

分析:n < 100因此可以用floyd。关键是建图方法,其实就是当做n+2个洞,然后floyd(距离:相交就是0,否则就是两点圆心距离 - 半径和),然后算起点和终点的距离。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <string>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <queue>
12 #include <stack>
13 #include <algorithm>
14 #define ll long long
15 #define mem(m, a) memset(m, a, sizeof(m))
16 #define repu(i, a, b) for(int i = a; i < b; i++)
17 #define maxn 505
18 #define eps 1e-5
19 const double PI=-acos(-1.0);
20 using namespace std;
21 double x[maxn],y[maxn],z[maxn],r[maxn];
22 double d[maxn][maxn];
23 double D(int i,int j)
24 {
25     return 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]));
26 }
27 int main()
28 {
29     int n,kase = 1;
30     while(scanf("%d",&n)&&n!=-1)
31     {
32         repu(i,1,n+1)
33         scanf("%lf%lf%lf%lf",&x[i],&y[i],&z[i],&r[i]);
34         repu(i,n+1,n+3)
35         scanf("%lf%lf%lf",&x[i],&y[i],&z[i]),r[i]=0.00;
36         n += 2;
37         repu(i,1,n+1)
38         repu(j,1,n+1)
39         {
40             if(i == j) d[i][j] = 0.00;
41             else
42             {
43                 if(D(i,j) - r[i] - r[j] < eps) d[i][j] = 0.00;
44                 else d[i][j] = D(i,j)-(r[i] + r[j]) * 1.00;
45             }
46         }
47         repu(k,1,n+1)
48         repu(i,1,n+1)
49         repu(j,1,n+1)
50         d[i][j] = min(d[i][j],d[i][k] + d[k][j]);
51         printf("Cheese %d: Travel time = %.0lf sec\n",kase++,d[n-1][n]*10.00);
52     }
53     return 0;
54 }
View Code

 

posted @ 2015-09-05 23:03  一麻袋码的玛侬  阅读(88)  评论(0)    收藏  举报