Frogger POJ - 2253(求兩個石頭之間」全部通路中最長邊中「的最小邊)

題意

題目主要說的是,有兩隻青蛙,在兩個石頭上,他們之間也有一些石頭,一隻青蛙要想到達另外一隻青蛙所在地方,必須跳在石頭上。題目中給出了兩隻青蛙的初始位置,以及剩餘石頭的位置,問一隻青蛙到達另外一隻青蛙所在地的全部路徑中的「the frog distance」中的最小值。ios

解釋一下「the frog distance」: 題目中給出了一段解釋「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.」 其中 jump range 實際上就是指一條通路上的最大邊,該詞前面的minimum就說明了要求全部通路中最大邊中的最小邊。若是直接說前面這句話你可能感受比較繞,經過上面的解釋後我想你應該明白了吧。算法

​ 經過上面的分析,不難看出這道題目的是求全部通路中最大邊中的最小邊,能夠經過利用floyd,Dijkstra算法解決該題目,注意這道題可不是讓你求兩個點之間的最短路的,只不過用到了其中的一些算法思想。固然解決該題須要一個特別重要的方程,即spa

d[j] = min(d[j], max(d[x], dist[x][j]));        //dis[j]爲從一號石頭到第j號石頭全部通路中最長邊中的最小邊

AC代碼

利用Dijkstra算法.net

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
typedef long double ld;
int n;
const int maxn = 200 + 10;
const int inf = 0x3f3f3f3f;
int x[maxn], y[maxn], vis[maxn];
double dist[maxn][maxn], d[maxn];
double solve()
{
    memset(vis, 0, sizeof(vis));
    for(int i = 1;i <= n; i++)
        d[i] = dist[i][1];
    for(int i = 1; i <= n; i++)
    {
        int x;
        double minn = inf;
        for(int j = 1; j <= n; j++)
        {
            if(!vis[j] && d[j] < minn)
            {
                x = j;
                minn = d[j];
            }
        }
        vis[x] = 1;
        for(int j = 1; j <= n; j++)
            d[j] = min(d[j], max(d[x], dist[x][j]));        //dis[j]爲從一號石頭到第j號石頭全部通路中最長邊中的最小邊
    }
    return d[2];
}

int main()
{
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int cnt = 0;
    while(scanf("%d", &n) && n)
    {
        for(int i = 1; i <= n; i++)
            scanf("%d %d", &x[i], &y[i]);
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(i == j)
                    dist[i][j] = 0;
                else
                    dist[i][j] = sqrt(double(x[i] - x[j])*(x[i] - x[j]) + double(y[i] - y[j])*(y[i] - y[j]));
            }
        }
        printf("Scenario #%d\n", ++cnt);
        printf("Frog Distance = ");
        printf("%.3lf\n\n",solve());
    }
}
相關文章
相關標籤/搜索