Freddy the frog ♪
描述
青蛙Freddy坐在湖中间的一块石头上。突然,他注意到坐在另一块石头上的青蛙Fiona。他计划去探望她,但由于水很脏,到处都是游客的防晒霜,他想避免游泳,而是跳跳来到达她。
不幸的是,Fiona的石头不在他的跳跃范围内。因此,Freddy考虑使用其他石头作为中间停靠点,并通过几次小跳来到达她。要执行给定的跳跃序列,青蛙的跳跃范围显然必须至少与序列中发生的最长跳跃一样长。
将两块石头之间的青蛙距离(人类也称为最小最大距离)定义为两块石头之间所有可能路径的最小必要跳跃范围。
您将获得Freddy石头,Fiona石头和湖中所有其他石头的坐标。您的工作是计算Freddy和Fiona的石头之间的青蛙距离。
.
输入项
输入将包含一个或多个测试用例。每个测试用例的第一行将包含石头数量n(2 <= n <= 200)。
接下来的 n条线分别包含两个整数xi,yi(0 <= xi,yi <= 1000),它们表示石头i的坐标。
第1块石头是Freddy的石头,第2块石头是Fiona的石头,其他n-2块石头没有人使用。
每个测试用例后面都有一个空白行。输入以n的零(0)值终止。
.
输出量
对于每个测试用例,打印一行“ Scenario #x”和一行“ Frog Distance = y”,
其中x替换为测试用例编号(从1开始编号),y替换为适当的实数,输出到三位小数。
在每个测试用例之后,甚至在最后一个测试用例之后,都应留一个空白行。
.
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
.
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const double oo = 1005.0;
const int N = 205;
int n,f;
double g[N][N],maxn[N];
bool visited[N];
struct Stone{
double x,y;
}stone[N];
void create(){
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
double dx=stone[i].x - stone[j].x ;
double dy=stone[i].y - stone[j].y ;
g[i][j]=g[j][i] = sqrt(dx*dx+dy*dy);
// printf("%lf\n\n",g[i][j]);
}
}
void dijk(){
for(int i=1;i<n;i++){
int p=0;
double minn=oo;
for(int j=1;j<=n;j++)
if(!visited[j]&&minn>maxn[j]){
minn=maxn[j];
p=j;
}
if(p==2) break;
visited[p]=true;
for(int j=1;j<=n;j++)
if(max(g[p][j],maxn[p])<maxn[j])
maxn[j]=max(g[p][j],maxn[p]);
}
}
int main(){
while(~scanf("%d",&n)){//判断是否输入数据,要是没输入就是-1
visited[1]=0;// 这里……要是写=1的话上面dijk()里面找最小值的时候根本不会搜到1这个点:)
if(n==0) break;
memset(g,0,g[N][N]);
for(int i=2;i<=n;i++) {
maxn[i]=oo;visited[i]=0;
}
f++;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&stone[i].x,&stone[i].y);
// printf("%lf %lf\n\n",stone[i].x,stone[i].y);
}
create();
dijk();
printf("Scenario #%d\n",f);
printf("Frog Distance = %.3f\n\n",maxn[2]);
}
return 0;
}
采用dijkstra的思想,把dist最短路换成路径中经过的最小的最大值。每次都找最优解点来推进更新进程——即最大值最小的那个点,因为别的点最大值已经比它大了,没办法再更新它。
关于dijkstra最短路:每次找dist最短的点,因为别的点现在路径就已经比它长了,以后再加边到达它时路径会变得更长,所以只能它更新别人别人不能更新它。
dijkstra的结果应该是和source的选择有关的吧
写代码时出现的问题:
- 忘记double应该怎么scanf和printf了
在线哭泣%lf输入 %f输出(仿佛是poj的格式要求不能%lf输出 真是玄学错误) - 数据类型要一直带着跑啊不能double一会又开始int了
- 多个测试点每次要初始化,初始化我又写错了…
- (
dijkstra用的真不熟练嗷)
2019.10.23晚