POJ - 2253Frogger青蛙跳石(最短路径变形)

这篇博客介绍了如何运用Dijkstra算法解决寻找最小最大跳跃距离的问题。作者给出了一种AC代码实现,通过遍历所有路径并计算每两点之间的距离,找到从起点到终点的最小最大跳跃值。博客内容涉及图论和算法应用,适合对算法感兴趣的读者学习。
摘要由CSDN通过智能技术生成

我是传送门

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]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值