poj 2253 Frogger(求最短路径中最大边)

题意:有两只青蛙,分别在两个石头上,青蛙A想要到青蛙B那儿去,他可以直接跳到B的石头上,也可以跳到其他石头上,再从其他石头跳到B那儿,求青蛙从A到B的所有路径中最小的Frog Distance,我们定义Frog Distance为从A到B的一条路径中所跳的最大距离,例如,如果从A到B某条路径跳的距离是2,5,6,4,则Frog Distance就是6,题目输入的第一行代表石头的个数,当个数为0时结束程序,接着有n行,其中第2,3行分别代表A,B青蛙的坐标,其他n-2行分别代表空的石头的坐标,输出一个小数(保留三位),具体格式参见样例,注意没输出一个答案还要再空一行。


思路:求最短路径中的最大值。dijkstra的变性,开始时将d[]数组初始化为inf,按照最短路径的查找方法,用d[]数组记录路径中的最大边。


#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;

#define inf 1e8
#define MAXV 210
#define max(a,b) (a>b?a:b)

typedef struct
{
    int x,y;
} Point;

Point point[MAXV];
double d[MAXV];
int n;

double dis(Point a,Point b)
{
    return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
}

void dijkstra()
{
    int i,j,vis[MAXV],v=1;
    double min;
    for(i=1; i<=n; i++)
    {
        d[i]=inf;//d[i]代表最短路径中的最大边
        vis[i]=0;
    }
    d[1]=0;
    for(i=1; i<=n; i++)
    {
        min=inf;
        for(j=1; j<=n; j++)
            if(!vis[j] && d[j]<min)//选择最短路径
            {
                min=d[j];
                v=j;
            }
        vis[v]=1;
        if(v==2) break;
        for(j=1; j<=n; j++)
            if(!vis[j] && d[j]>max(d[v],dis(point[v],point[j])))//d[j]>max()保证最短路径,max()为选择最短路径中的最大边
            {
                d[j]=max(d[v],dis(point[v],point[j]));
            }
    }
}

int main()
{
    int i,cnt=1;
    while(scanf("%d",&n) && n)
    {
        for(i=1; i<=n; i++) scanf("%d%d",&point[i].x,&point[i].y);
        dijkstra();
        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",cnt++,d[2]);
    }
    return 0;
}

你可能感兴趣的:(poj 2253 Frogger(求最短路径中最大边))