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

来源:互联网 发布:淘宝客服主管工资 编辑:程序博客网 时间:2024/05/19 02:25

Problem Description

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

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

#include<cstdio>#include<cmath>#include<algorithm>#define INF 0x3f3f3f3f * 1.0using 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;}
原创粉丝点击