我是传送门
Sample Input
2
0 0
3 4
3
17 4
19 4
18 5
0
Sample Output
Scenario #1
Frog Distance = 5.000
Scenario #2
Frog Distance = 1.414
题意:给出n个坐标,第一个是舔🐸所在位置,第二个是女生所在位置,下边可能还给出中间石头的位置。舔🐸找女神的途中,可能有多条路径,求这些路径当中的最小的最大跳跃距离;(最大相对一条路径说的,最小是多条路径中的所有’最大路径‘的最小值)
分析:把所有坐标代入数组,每两个点都遍历一边,赋值其距离;用两种最短路径来把所有路径都遍历一边,求出点1到点2的要求值;
ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
int inf=99999999;
using namespace std;
int k=0,i,j,minn,u,book[300],t;
double x[300],y[300],e[300][300],dis[300];
int main()
{
while(~scanf("%d",&t)&&t)
{
memset(book,0,sizeof(book));
for(i=1;i<=t;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(i=1;i<=t;i++)
for(j=i+1;j<=t;j++)
e[i][j]=e[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
book[1]=1;
for(i=2;i<=t;i++)
dis[i]=e[1][i];
for(i=1;i<=t-1;i++)
{
minn=inf;
for(j=1;j<=t;j++)
{
if(!book[j]&&dis[j]<minn)
{
u=j;
minn=dis[u];
}
}
book[u]=1;
for(j=1;j<=t;j++)
dis[j]=min(dis[j],max(dis[u],e[u][j]));
}
//printf("Scenario #%d\n",++k);
//printf("Frog Distance = %.3lf\n\n",dis[2]);//poj上%lf会wa,金牌爷说这是poj的问题;
printf("Scenario #%d\n",++k);
printf("Frog Distance = %.3f\n\n",dis[2]);
}
}
/*模板dis记录的是点i距离点1的距离,该题记录的是走到i点之前当中的最大跳跃距离;
每次找一个距离主干最近的点,过这个点遍历其他的点,最后相当于把所有的点都遍历了一遍;
fload算法更直接一点:
for(k=1;k<=t;k++)
for(i=1;i<=t;i++)
for(j=1;j<=t;j++)
{
if(e[i][j]>max(e[i][k],e[k][j])
e[i][j]=max(e[i][k],e[k][j]);
}
printf("%d\n",e[1][2]);