Frogger POJ 2253

http://poj.org/problem?id=2253

题意:有一只青蛙A想要跳到另一只青蛙B处, 由于青蛙A的跳跃幅度没有那么大, 所以它需要借助它周边的一些石头从而到达青蛙B处。问你在众多可供选择的道路中,哪条道路中跳跃的最大值要比其他道路中的最大值小。(也就是求它的跳跃幅度至少要为多少)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
#define oo 0x3f3f3f3f
#define maxn 500
double maps[maxn][maxn], dist[maxn];
int v[maxn];
int n;

struct node
{
    int x, y;
}A[maxn];

double F(int i, int j)
{
    return (sqrt(pow((double)A[i].x-A[j].x, 2)+pow((double)A[i].y-A[j].y, 2)));
}

double Dij()
{
    memset(v, 0, sizeof(v));
    for(int i=1; i<=n; i++)
    dist[i] = maps[1][i];

    dist[1] = 0;
    v[1] = 1;

    for(int i=1; i<n; i++)
    {
        int index;
        double mins = 10000000;
        for(int j=1; j<=n; j++)
        {
            if(!v[j] && dist[j] < mins)
            {
                index = j;
                mins = dist[j];
            }
        }

        v[index] = 1;

        for(int j=1; j<=n; j++)
        {
            if(!v[j])
            {
                double maxs = max(mins, maps[index][j]);
                 if(dist[j]>maxs) dist[j] = maxs;
            }
        }
    }
    return dist[2];
}

int main()
{
     int cnt = 1;
     while(scanf("%d", &n), n)
     {
         for(int i=1; i<=n; i++)
            scanf("%d %d", &A[i].x, &A[i].y);

        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<i; j++)
            {
                maps[i][j] = maps[j][i] = F(i, j);
            }
            maps[i][i] = 0;
        }

       double ans = Dij();
       printf("Scenario #%d\n", cnt++);
       printf("Frog Distance = %.3f\n\n", ans);

     }
    return 0;
}

#include<algorithm>
#include<queue>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<math.h>
using namespace std;

const int maxn = 205;
const int oo = 0xfffffff;

struct point
{
    double x, y;
} p[maxn];
struct node
{
    int y;
    double len;
    node(int y, double len):y(y), len(len) {}
};
vector<node> G[maxn];
double v[maxn];

//求两点间的距离
double Len(point a, point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void Spfa()
{
    queue<int> Q;
    Q.push(1);

    while(Q.size())
    {
        int s = Q.front();
        Q.pop();
        int len = G[s].size();

        for(int i=0; i<len; i++)
        {
            node q = G[s][i];

            if(v[s] < v[q.y] && q.len < v[q.y])
            {
                v[q.y] = max(v[s], q.len);//要选取一条路上的最大的那条边
                Q.push(q.y);
            }
        }
    }
}

int main()
{
    int N, t=1;

    while(scanf("%d", &N), N)
    {
        int i, j;

        for(i=1; i<=N; i++)
            scanf("%lf%lf", &p[i].x, &p[i].y);

        for(i=1; i<=N; i++)
            for(j=1; j<=N; j++)
            {
                if(i == j)
                    continue;

                double len = Len(p[i], p[j]);
                G[i].push_back(node(j, len));
            }

        for(i=1; i<=N; i++)
            v[i] = oo;
        v[1] = 0;

        Spfa();

        if(t != 1)printf("\n");
        printf("Scenario #%d\n", t++);
        printf("Frog Distance = %.3f\n", v[2]);

        for(i=1; i<=N; i++)
            G[i].clear();
    }

    return 0;

时间: 2024-10-29 03:59:22

Frogger POJ 2253的相关文章

floyd类型题UVa-10099-The Tourist Guide +Frogger POJ - 2253

The Tourist Guide Mr. G. works as a tourist guide. His current assignment is to take some tourists from one city to another. Some two-way roads connect the cities. For each pair of neighboring cities there is a bus service that runs only between thos

Frogger - poj 2253 (Dijkstra)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28802   Accepted: 9353 Description 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 sinc

Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)

题意 ? 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青蛙所在地的所有路径中的"the frog distance"中的最小值. ? 解释一下"the frog distance": 题目中给出了一段解释"The frog distance (humans also call it minimax distance

B - Frogger POJ - 2253

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 rea

POJ 2253 Frogger

题意:一只青蛙找到另外一只青蛙,不过可以通过其它的石头跳到目标青蛙的位置去,其中,输入数据的时候第一组数据是第一只青蛙的位置,第二组是目标青蛙的位置,其它的为石头的位置 思路:dijkstra算法的一种小小的变形,做法还是一样的 Tips:POJ上的双精度浮点型输出竟然是%f输出害的我一直错,或者是编译错误,恼啊! AC代码: #include<cstdio> #include<cmath> #include<algorithm> using namespace std

[2016-04-02][POJ][2253][Frogger]

时间:2016-04-02 17:55:33 星期六 题目编号:[2016-04-02][POJ][2253][Frogger] 题目大意:给定n个点的坐标,问从起点到终点的所有路径中,最大边的最小值是多少,即每一步至少是多少才能走到终点 分析: 方法1: 枚举出完全图,然后从起点跑一次Dijkstra算法,不过选点不再是选择起点到终点路径的点,而是起点到终点的路径中,边最大边最小的点,即d数组保存起点到当前点的路径中最大边的最小值, 最大边的最小值:u->v d[v] = min(d[i],m

Floyd-Warshall算法(求解任意两点间的最短路) 详解 + 变形 之 poj 2253 Frogger

/* 好久没有做有关图论的题了,复习一下. --------------------------------------------------------- 任意两点间的最短路(Floyd-Warshall算法) 动态规划: dp[k][i][j] := 节点i可以通过编号1,2...k的节点到达j节点的最短路径. 使用1,2...k的节点,可以分为以下两种情况来讨论: (1)i到j的最短路正好经过节点k一次 dp[k-1][i][k] + dp[k-1][k][j] (2)i到j的最短路完全

POJ 2253 - Frogger (floyd)

A - Frogger Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description 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

poj 2253 Frogger 解题报告

题目链接:http://poj.org/problem?id=2253 题目意思:找出从Freddy's stone  到  Fiona's stone  最短路中的最长路. 很拗口是吧,举个例子.对于 i 到 j 的一条路径,如果有一个点k, i 到 k 的距离 && k 到 j 的距离都小于 i 到 j 的距离,那么就用这两条中较大的一条来更新 i 到 j 的距离 .每两点之间都这样求出路径.最后输出 1 到 2 的距离(1:Freddy's stone   2:Fiona's sto