POJ - 2253 Frogger(最短路)(Floyed算法)(注释详解)

POJ - 2253 Frogger (Floyed算法)

Problem 

Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tourists' sunscreen, he wants to avoid swimming and instead reach her by jumping. 
Unfortunately Fiona's stone is out of his jump range. Therefore Freddy considers to use other stones as intermediate stops and reach her by a sequence of several small jumps. 
To execute a given sequence of jumps, a frog's jump range obviously must be at least as long as the longest jump occuring in the sequence. 
The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones. 

You are given the coordinates of Freddy's stone, Fiona's stone and all other stones in the lake. Your job is to compute the frog distance between Freddy's and Fiona's stone. 

Input

The input will contain one or more test cases. The first line of each test case will contain the number of stones n (2<=n<=200). The next n lines each contain two integers xi,yi (0 <= xi,yi <= 1000) representing the coordinates of stone #i. Stone #1 is Freddy's stone, stone #2 is Fiona's stone, the other n-2 stones are unoccupied. There's a blank line following each test case. Input is terminated by a value of zero (0) for n.

Output

For each test case, print a line saying "Scenario #x" and a line saying "Frog Distance = y" where x is replaced by the test case number (they are numbered from 1) and y is replaced by the appropriate real number, printed to three decimals. Put a blank line after each test case, even after the last one.

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

 



题意:

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

 

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

 

先输出"Scenario #x", x代表样例序号。
接下来一行输出"Frog Distance = y", y代表你得到的答案。
每个样例后输出一个空行。

 

思路:

现在要求求出所有通路的最大距离,并把这些最大距离作比较,取最小的一个作为青蛙的最小跳远距离。

#include 
#include 
#include 
#include 
#include 

#define maxn 300
#define INF 0x3f3f3f3f
using namespace std;
int x[maxn],y[maxn],n;
double mapp[maxn][maxn];
void floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                mapp[i][j]=min(mapp[i][j],max(mapp[i][k],mapp[k][j]));//当前边的最大值和其他边比取最小
                //i->k,k->j中选最大的一条边和原来i->j比较,
                //当边i->k,k->j的权值都小于i->j时,则走i->k->j路线,否则走i->j路线
                
}
int main()
{
    int q=1;
    while(cin>>n&&n)
    {
        for(int i=0; i<=n; i++)
        {
            for(int j=0; j<=0; j++)
            {
                if(i==j)
                    mapp[i][j]=0;
                else
                    mapp[i][j]=INF;
            }
        }
        for(int i=1; i<=n; i++)
            cin>>x[i]>>y[i];
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)//计算两点间距离
                mapp[i][j]=mapp[j][i]=sqrt((double)(x[i]-x[j])*(double)(x[i]-x[j])+(double)(y[i]-y[j])*(double)(y[i]-y[j]));
        floyd();
          printf("Scenario #%d\nFrog Distance = %.3f\n\n",q++,mapp[1][2]);
        /*cout<

你可能感兴趣的:(kuangbin,专题四,最短路练习,Kuangbin,最短路,Floyed)