HDU1245Saving James Bond (Floyd 算法求最短路)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1245

Floyd 算法求最短路

计算几何

由于精度问题。这道题目要C++才能AC, G++不能AC。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
struct node
{
    double x;
    double y;
}a[110];
double map[110][110];
int step[110][110];
int s[110];
int t[110];
const double INF = 100000000;
const double eps = 1e-8;
double min(double x, double y)
{
    return x<y?x:y;
}
void floyd(int n)
{
    int i, j, k;
    for(k = 0; k <= n; k++)
    for(i = 0; i <= n; i++)
    for(j = 0; j <= n; j++)
        if(map[i][j] > map[i][k]+map[k][j])
            {
                map[i][j] = map[i][k]+map[k][j];
                step[i][j] = step[i][k]+step[k][j];
            }
}
int main()
{
    int n, i, j, num;
    double d, dd;
    double x, y;
    while(cin>>n>>d)
    {
        for(i = 1, j = 1; i <= n; i++)
        {
            scanf("%lf%lf", &x, &y);
            if(fabs(x)<=7.5 && fabs(y)<=7.5)
                continue;
            a[j].x = x;
            a[j].y = y;
            j++;
        }
        num = j;
        if(num == 1)
        {
            if(d >= 42.5)
                printf("42.50 1\n");
            else
                printf("can't be saved\n");
            continue;
        }
        for(i = 0; i <= num; i++)
            for(j = 0; j <= num; j++)
            {
                map[i][j] = INF;
                step[i][j] = 0;
            }
        for(i = 1; i < num; i++)
        for(j = 1; j < num; j++)
        {
            if(j==i)
            {
                map[i][j] = 0;
                continue;
            }
            map[i][j] = sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
            step[i][j] = 1;
            if(map[i][j] > d)
            {
                map[i][j] = INF;
                step[i][j] = 0;
            }
        }
        int len1 = 0;
        int len2 = 0;
        for(i = 1; i < num; i++)
        {
            if(sqrt(a[i].x*a[i].x+a[i].y*a[i].y)-7.5 <= d)
                s[len1++] = i;
            if(50-fabs(a[i].x)<=d || 50-fabs(a[i].y)<=d)
                t[len2++] = i;
        }

        for(i = 0; i < len1; i++)
        {
            map[0][s[i]] = map[s[i]][0]= sqrt(a[s[i]].x*a[s[i]].x+a[s[i]].y*a[s[i]].y)-7.5;
            step[0][s[i]] = step[s[i]][0] = 1;
        }
        for(i = 0; i < len2; i++)
        {
            map[t[i]][num] = map[num][t[i]] = min(50-fabs(a[t[i]].x), 50-fabs(a[t[i]].y));
            step[t[i]][num] = step[num][t[i]] = 1;
        }
        floyd(num);
        if(map[0][num] == INF)
            printf("can't be saved\n");
        else
            printf("%.2lf %d\n", map[0][num], step[0][num]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值