Uva1001-floyd算法-建图

给出一些球,球内的时间为零,球之间的速度为10每单位。

给两个点,求最短时间。

 

把每一个球当做点,球间的距离就是floyd的d数组。之后跑一遍floyd

 

wa了两发因为d数组定义成int了

 

#include <algorithm>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>

using namespace std;

const int INF = 100000;

int N,M,T;
double d[110][110];

struct holes
{
    int x,y,z;
    int r;
}hole[110];

double dist(int a,int b)
{
    double ans =  (sqrt(abs(hole[a].x-hole[b].x)*abs(hole[a].x-hole[b].x)+
                        abs(hole[a].y-hole[b].y)*abs(hole[a].y-hole[b].y)+
                        abs(hole[a].z-hole[b].z)*abs(hole[a].z-hole[b].z)
                    ) - (hole[a].r + hole[b].r)) ;
    return ans > 0 ? ans : 0;
}

int main()
{
    while(scanf("%d",&N) && N != -1)
    {
        T++;
        for(int i=0;i<N;i++)
        {
            scanf("%d%d%d%d",&hole[i].x,&hole[i].y,&hole[i].z,&hole[i].r);
        }
        scanf("%d%d%d",&hole[N].x,&hole[N].y,&hole[N].z);
        scanf("%d%d%d",&hole[N+1].x,&hole[N+1].y,&hole[N+1].z);
        hole[N].r = 0;
        hole[N+1].r = 0;

        for(int i=0;i<N+2;i++)
            for(int j=0;j<N+2;j++)
                d[i][j] = (i==j ? 0 : INF);

        for(int i=0;i<N+2;i++)
            for(int j=0;j<N+2;j++)
            {
                if(i != j) d[i][j] = dist(i,j);
            }

        for(int k=0;k<N+2;k++)
            for(int i=0;i<N+2;i++)
                for(int j=0;j<N+2;j++)
                    d[i][j] = min(d[i][j] , d[i][k]+d[k][j]);

        d[N][N+1]*=10;
        int ans = (d[N][N+1]-(int)d[N][N+1]) < (((int)d[N][N+1]+1)-d[N][N+1]) ? (int)d[N][N+1] : (int)d[N][N+1]+1;
        printf("Cheese %d: Travel time = %d sec\n",T,ans);
    }    
}

 

posted @ 2015-10-19 17:06  Helica  阅读(302)  评论(0编辑  收藏  举报