最短路径--Floyd--Frogger

最短路径–Floyd–Frogger

Description
佛莱迪青蛙坐在湖中央的一块石头上。突然,他注意到菲奥娜·青蛙正坐在另一块石头上。他计划去看她,但由于水很脏,里面满是游客的防晒霜,他想避免游泳,而是跳到她跟前。
不幸的是菲奥娜的石头超出了他的跳跃范围。因此,弗雷迪考虑使用其他石头作为中间站,并通过一系列的小跳跃到达她。
要执行给定的跳跃序列,青蛙的跳跃范围显然必须至少与该序列中发生的最长跳长相同。
青蛙距离(人类也称其为最小最大距离)在两块石头之间,因此被定义为两块石头之间所有可能的路径之间的最小必要跳跃范围。

你得到了弗雷迪的石头,菲奥娜的石头和湖中所有其他石头的坐标。你的工作是计算佛莱迪和菲奥娜的石头之间的青蛙距离。

Input
输入将包含一个或多个测试用例。每个测试用例的第一行将包含石头数n(2<=n<=200)。接下来的n行包含两个整数xi(0<=xi,yi<=1000),表示stone#i的坐标。stone#1是Freddy‘s stone,stone#2是Fiona’s stone,其他n-2石头是空的。每个测试用例后面都有一个空行。输入以n的零(0)值结束。

Output
对于每个测试用例,打印一条写着“场景#x”的行和一条“青蛙距离=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

最短路径问题,此题可以使用Floyd,用一个二维数组anw[ i ][ j ]表示i到j的距离

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>

using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=205;
int x[MAX],y[MAX];
double anw[MAX][MAX];
int main()
{
	int n,num=1;
	while((scanf("%d",&n),n))
	{
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		memset(anw,0,sizeof(anw));
		for(int i=0;i<n;i++)
		{
			cin>>x[i]>>y[i];
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				anw[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
			}
		}
		for(int k=0;k<n;k++)
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					if(anw[i][j]>max(anw[i][k],anw[k][j]))
					anw[i][j]=max(anw[i][k],anw[k][j]);	
				}
			}
		}
		printf("Scenario #%d\nFrog Distance = %.3f\n\n",num++,anw[0][1]);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值