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;}