Poj 2253 Frogger

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晚

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值