#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int M = 205;
const double MAX = 9999999;
double dist[M][M];
double maxn;
/*
题意从1 到2 的路径有很多条, 每一条路中都有最长的一段路, 最长的这一段就为当前路的最大跳跃;
找出所有从1 到2 的路中最大跳跃最小的值; 即为结果;
*/
struct node {
double x;
double y;
}s[M];
int n;
void init() {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
dist[i][j] = dist[j][i] = sqrt((s[i].x - s[j].x)*(s[i].x - s[j].x) + (s[i].y - s[j].y) *(s[i].y - s[j].y));
}
}
}
double floyd() {
double dis[M];
int vist[M];
int index;
double minn;
for(int i = 1; i <= n; i++) {
dis[i] = dist[1][i];
vist[i] = 0;
}
dis[1] = 0;
vist[1] = 1;
index = 1;
for(int k = 1; k <= n; k++) {
minn = MAX;
for(int i = 1; i <= n; i++) {
if(!vist[i] && minn > dis[i]) {
minn = dis[i];
index = i;
}
}
if(minn == MAX)
break;
vist[index] = 1;
for(int j = 1; j <= n; j++) {
if(!vist[j] && dis[j] < MAX && dis[j] > dist[index][j]){
maxn = max(dis[index], dist[index][j]);
dis[j] = min(maxn, dis[j]);
}
}
}
return dis[2];
}
int main()
{
int q = 1;
while(scanf("%d", &n) != EOF && n) {
for(int i = 1; i <= n; i++) {
scanf("%lf%lf", &s[i].x, &s[i].y);
}
init();
printf("Scenario #%d\n", q++);
printf("Frog Distance = %.3lf\n\n", floyd());
}
return 0;
}
poj 2253Frogger
最新推荐文章于 2019-10-24 08:37:16 发布