题意:有两只青蛙,分别在两个石头上,青蛙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;
}