//POJ-2253-Frogger
给出两只青蛙的坐标A、B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。
现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。
AC Code : floyd Memory: 496K Time: 47Ms
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#define max(x,y) (x>y?x:y)
#define MaxV 202
using namespace std;
int n; double X[MaxV],Y[MaxV]; double map[MaxV][MaxV];
double counter(int a,int b)
{return sqrt((X[a]-X[b])*(X[a]-X[b])+(Y[a]-Y[b])*(Y[a]-Y[b])); }
void init()
{int i,j;
memset(map,0,sizeof(map)); memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y));
for(i=1;i<=n;i++)
scanf("%lf%lf",&X[i],&Y[i]);
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
map[j][i]=map[i][j]=counter(i,j);
}
void floyd()
{int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{ if(map[i][k]<map[i][j]&&map[k][j]<map[i][j])
if(map[i][k]>=map[k][j]) map[i][j]=map[j][i]=map[i][k];
else map[i][j]=map[j][i]=map[k][j];
}
}
intmain()
{ //freopen("in.txt","r",stdin);
int i=1;
while(scanf("%d",&n)!=EOF)
{ if(n==0) break;
init();
floyd();
printf("Scenario #%d\nFrog Distance = %0.3lf\n\n",i,map[1][2]);
i++;
}
return 0;
}