zoukankan      html  css  js  c++  java
  • POJ 2253 Frogger

     题目链接:

    poj.org/problem?id=2253

    题目大意:

    Freddy Frog 坐在湖中的一个石头上, 突然的他注意到 Fiona Frog 坐在另一个石头上, Freddy Frog 要去拜访 Fiona Frog , 但是水很脏,而且有游客的防晒霜漂上面, 为了避免游泳过去他只能跳过去。

    不幸的是Fiona 所在的石头不在他跳跃的范围内,因此他只能跳跃几个其他的石头到达 Fiona 所在的石头, 这个青蛙的跳跃有个极大的距离 和 极小距离,  明显的 在他跳跃的路上, 最长距离不能超过他的跳跃极限。

    给你所有石头在湖里的坐标, 你的任务是计算 两个人所在石头的距离。

    输入:

    第一行 一个 n 代表石头的个数, 第一个石头 Freddy 的位置,第二个石头 Fiona 的位置,  其余的n-2个石头是空的, 给你每个点的坐标, 要求的是找出 一条路径, 要你求这个路上的两个石头的最长距离,在所有路径中最短。

    题目分析:

    这道题目其实就是最短求最大边, 以前有做过此类题目。 运用SPFA 就直接写了

    注意: 提交的时候请用 C++ 别用G++

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <cmath>
    using namespace std;
    #define INF 0xfffffff
    #define maxn 300
    
    struct Point
    {
        double x, y;
    };
    
    double Len(Point A, Point B)
    {
        return sqrt( (A.x-B.x) * (A.x-B.x) + (A.y-B.y)*(A.y-B.y) );
    }
    
    int n;
    double dist[maxn];
    double G[maxn][maxn];
    bool vis[maxn];
    
    double Spfa()
    {
        int P = 1;
        queue<int> Q;
        
        Q.push(P);
    
        while( !Q.empty() )
        {
            P = Q.front();
            Q.pop();
            vis[P] = false;
    
            for(int i=1; i<=n; i++)
            {
                if(dist[i] > max(dist[P],G[P][i]) )
                {
                    dist[i] = max(dist[P],G[P][i]);
    
                    if( !vis[i] )
                    {
                        vis[i] = true;
                        Q.push(i);
                    }
                }
            }
        }
        return dist[2];
    }
    
    void Init()
    {
        for(int i=1; i<=n; i++)
        {
            dist[i] = INF;
            vis[i] = false;
            for(int j=1; j<=n; j++)
                G[i][j] = INF;
        }
        dist[1] = 0;
    }
    int main()
    {
        Point P[maxn];
        int cas = 1;
        while(scanf("%d", &n), n)
        {
            Init();
            for(int i=1; i<=n; i++)
            {
                scanf("%lf%lf",&P[i].x,&P[i].y);
            }
    
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=i; j++)
                {
                    G[i][j] = Len(P[i],P[j]);
                    G[j][i] = G[i][j];
                }
            }
    
            double ans = Spfa();
    
            printf("Scenario #%d
    ",cas ++);
    
            printf("Frog Distance = %.3lf
    
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4157878.html
Copyright © 2011-2022 走看看