【POJ – 2253】Frogger (Floyd算法)

–>Frogger

 中文翻译

Descriptions:

湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。

Input

多实例输入 
先输入一个整数n表示石头数量,当n等于0时结束。
接下来2-n+1行依次给出编号为1到n的石头的坐标xi , yi。
2 <= n <= 200 
0 <= xi , yi <= 1000


Output

先输出”Scenario #x”, x代表样例序号。
接下来一行输出”Frog Distance = y”, y代表你得到的答案。 
每个样例后输出一个空行。
(ps:wa有可能是精度问题,g++不对可以用c++尝试,都不对就是代码问题)


Sample Input

2
0 0
3 4

3
17 4
19 4
18 5

0

Sample Output

Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414

题目链接:
https://vjudge.net/problem/POJ-2253

 

我也是第一次做这样的题,用到一个算法

Floyd算法求出两两最短路,再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。

 

AC代码:

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 205
using namespace std;
struct node
{
    double x,y;
};
node points[Maxn];
double path[Maxn][Maxn];//两点间的权值
int cases=1;
int n;
//Floyd算法
void floyd()
{
    for(int k=1; k<=n; k++)
        //主要针对由i到j的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同)
        for(int i=1; i<=n-1; i++)
            for(int j=i+1; j<=n; j++)
                //当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线
                if(path[i][k]<path[i][j]&&path[k][j]<path[i][j])
                    //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通
                    if(path[i][k]<path[k][j])
                        path[i][j]=path[j][i]=path[k][j];
                    else
                        path[i][j]=path[j][i]=path[i][k];
}
int main()
{
    while(cin>>n,n)
    {
        for(int i=1; i<=n; i++)
            cin>>points[i].x>>points[i].y;
        for(int i=1; i<=n-1; i++)
            for(int j=i+1; j<=n; j++)
            {
                //两点间的距离
                double tx=points[j].x-points[i].x;
                double ty=points[j].y-points[i].y;
                path[i][j]=path[j][i]=sqrt(tx*tx+ty*ty);//双向性
            }

        floyd();
        cout<<"Scenario #"<<cases++<<endl;
        printf("Frog Distance = %.3lf\n\n",path[1][2]);
    }
}

 

posted on 2019-07-17 22:25 Sky丨Star 阅读() 评论() 编辑 收藏

版权声明:本文为sky-stars原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sky-stars/p/11204110.html