这道题题目大意,有两只青蛙,分别在两个石头上,青蛙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行分别代表空的石头的坐标,输出一个小数(保留三位),具体格式参见样例,注意没输出一个答案还要再空一行。
题目数据1很明显为5.000
对于数据2青蛙有两种方案
方案1:1-2则经过距离为2.000故此时Frog Distance=2.000
方案2:1-3-2 则经过距离分别是1.414 1.414 故此时Frog Distance=1.414
故所求的最小的Frog Distance=1.414
这道题和上一道题POJ1797很相似,那个是求最大生成树的最小权,这个是求最小生成树的最大权,大同小异,同样是Dijkstra变形。代码如下:
#include<stdio.h>
#include<math.h>
struct node
{
float x,y;
};
node map[205];
int vis[205];
float dis[205];
float mpt[205][205];
int n;
float Max(float a,float b)
{
return a>b?a:b;
}
void Dij()
{
int i,j;
for(i=0;i<n-1;i++)
{
float min=1000000000;
int u=-1;
for(j=0;j<n-1;j++)
{
if(!vis[j]&&min>dis[j])
{
min=dis[j];
u=j;
}
}
if(u==-1)break;
vis[u]=1;
for(j=0;j<n-1;j++)
{
if(!vis[j]&&Max(dis[u],mpt[u][j])<dis[j]) //更新条件
{
dis[j]=Max(dis[u],mpt[u][j]);
}
}
}
}
int main()
{
int i,j;
node s,e; //起始点
int cnt=0;
while(scanf("%d",&n))
{
if(!n)break;
scanf("%f %f",&s.x,&s.y);
scanf("%f %f",&e.x,&e.y);
for(i=0;i<n-2;i++)
{
scanf("%f %f",&map[i].x,&map[i].y);
vis[i]=0;
dis[i]=sqrt((s.x-map[i].x)*(s.x-map[i].x)+(s.y-map[i].y)*(s.y-map[i].y));
}
map[i]=e;
vis[i]=0;
dis[i]=sqrt((s.x-e.x)*(s.x-e.x)+(s.y-e.y)*(s.y-e.y));
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(i==j)mpt[i][j]=0;
else mpt[i][j]=sqrt((map[j].x-map[i].x)*(map[j].x-map[i].x)+(map[j].y-map[i].y)*(map[j].y-map[i].y));
}
}
Dij();
printf("Scenario #%d\nFrog Distance = %.3f\n\n",++cnt,dis[n-2]);
}
return 0;
}