题意: 大致就是求出青蛙A跳到到青蛙B的位置经过的边至少能为多少, 这样就相当于求A->B的一条路上的最大边, 在每一条A->B的路的最大边中取最小值为答案;
坑: g++要求double 保留3位有效数字时候用%.3f, 用%.3lf会WA。。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define inf 1e9;
using namespace std;
const int maxn = 205;
int n;
double dis[maxn][maxn];
int x[maxn], y[maxn];
double max(double x, double y){
return (x>y)?x:y;
}
double min(double x, double y){
return (x<y)?x:y;
}
double ans;
void dijkstra(){
int i, j, v=1;
double d[maxn];
int vis[maxn];
memset(vis, 0, sizeof(vis));
for(i=1; i<=n; i++) d[i] = dis[1][i];
vis[1]=1;
for(j=1; j<n; j++){
double MIN=inf;
for(i=1; i<=n; i++){
if(d[i]<MIN && !vis[i]){
MIN = d[i];
v = i;
}
}
vis[v] = 1;
for(i=1; i<=n; i++){
if(!vis[i]){
d[i] = min(d[i], max(dis[v][i], d[v] ));
}
}
}
ans = d[2];
return;
}
int main()
{
int i, j, cas=0;
//freopen("in.txt", "r", stdin);
while(~scanf("%d", &n), n){
ans = 0;
for(i=1; i<=n; i++) scanf("%d %d", &x[i], &y[i]);
for(i=1; i<=n; i++){
for(j=1; j<i;j++){
dis[j][i] = dis[i][j] = sqrt(1.0*( (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) ));
}
dis[i][i] = 0;
}
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3f\n\n",++cas,ans);
}
return 0;
}