【最短路中求至少需要的最短跳跃距离】poj 2253 Frogger

本文介绍了一种计算从一个坐标点到其他多个坐标点所需的最短跳跃距离的算法。使用了Dijkstra算法来找到从起点到其他各点的最短路径,并通过浮点数而非双精度数来解决精度匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

输入n,接下来有n个点的坐标。要你求出从第一个坐标点,到第二个坐标点,至少需要的最短跳跃距离(意思就是只要你满足这个值,你肯定能从第一个坐标点到达第二个坐标点)

思路:改变下状态变成求,第一个坐标点到所有坐标点的至少需要的最短跳跃距离(坑点,double类型精度太高没法对,得float类型才可以,我内心是绝望的一直以为是自己算法错误)

#include<cstdio>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f * 1.0
using namespace std;
struct node
{
    float x, y;
};
node a[202];
float Map[202][202];
float dist[202];
int vis[202], n;
void dijkstra(int u)
{
    int i, j;
    for(i = 0; i < n; i++)//初始化
    {
        vis[i] = 0;
        dist[i] = Map[u][i];
    }
    vis[0] = 1;//用过的点标记1
    for(i = 0; i < n - 1; i++)
    {
        float Min = INF;
        float dis;
        for(j = 0; j < n; j++)
        {
            if(!vis[j] && Min > dist[j])
            {
                u = j;
                Min = dist[j];
            }
        }
        if(Min == INF) break;
        vis[u] = 1;
        for(j = 0; j < n; j++)
        {
        //到起始点至少需要的最短跳跃距离,和起始点到下一个点的距离,求最大(因为你的满足最大你才能过去)如果比下一个点至少需要的最短跳跃距离要小,就更新。
            if(!vis[j] && dist[j] > (dis = max(dist[u], Map[u][j])))
            {
                dist[j] = dis;
            }
        }
    }
}
float f(node u, node v)//两点间距离公式
{
    return sqrt((u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y));
}
int main()
{
    int i, j, cas = 0;
    while(~scanf("%d", &n) && n)
    {
        for(i = 0; i < n; i++)
        {
            scanf("%f %f", &a[i].x, &a[i].y);
        }
        for(i = 0; i < n; i++)//求各个点之间的距离
        {
            for(j = 0; j < n; j++)
            {
                Map[j][i] = Map[i][j] = f(a[i], a[j]);
            }
        }
        dijkstra(0);
        printf("Scenario #%d\n", ++cas);
        printf("Frog Distance = %.3f\n\n", dist[1]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值