poj 2253Frogger
来源:互联网 发布:淘宝发布宝贝放入仓库 编辑:程序博客网 时间:2024/06/14 15:52
#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;}