题目大意: 题意很简单就是有一个公青蛙想要去找母青蛙, 然后水上有n个石头, 公青蛙在第一个上, 母青蛙在第二个. 然后给出n个石头的坐标, 求一个最小的跳跃距离, 这个跳跃距离是它所有的跳跃中距离最大的. 也就是说要找一条路径, 这个路径不是求最短路了, 而是这个路径中距离最大的两个点尽量的小.
题目分析: 还是用最短路搜索, 不过要稍微改进,这次维护的不是总路长, 而是路中每一段中的最大值. 每个点维护最小的路径最大值即可. 算法用Bellman-Ford写起来方便, 时间足够.
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double d[205];
double mp[205][205];
int X[205], Y[205];
int n;
void Bellman_Ford()
{
for(int i=0; i<205; ++i) d[i] = 3000000.0;
d[0] = 0;
for(int k=0; k<n; ++k)
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
d[j] = min(d[j], max(d[i], mp[i][j]));
}
int main()
{
int Case = 1;
while(scanf("%d", &n) && n)
{
for(int i=0; i<n; ++i)
scanf("%d%d", &X[i], &Y[i]);
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
mp[i][j] = mp[j][i] = sqrt(double(X[i]-X[j])*(X[i]-X[j]) + double(Y[i]-Y[j])*(Y[i]-Y[j]));
Bellman_Ford();
printf("Scenario #%d\nFrog Distance = %.3f\n\n", Case++, d[1]);
}
return 0;
}