最短路径–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;
}