码迷,mamicode.com
首页 > 其他好文 > 详细

poj2253

时间:2019-08-25 18:10:47      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:sqrt   max   想去   http   turn   poj   解题思路   cstring   scanf   

1.链接地址

    https://vjudge.net/problem/POJ-2253#author=dusenlin

2.问题描述

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

输入样例

 

2
0 0
3 4

3
17 4
19 4
18 5

0

输出样例

Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414

3.解题思路

比较经典的模板题

可以直接用floyed算法或者dijkstra算法

4.算法实现源代码

floyed算法:

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 300;

int x[maxn],y[maxn];
double map[maxn][maxn];
int n;

void floyed()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                map[i][j]=min(map[i][j],max(map[i][k],map[k][j]));
            }
        }
    }
}

int main()
{
    int q = 1;
    while(~scanf("%d",&n)&&n)
    {
        memset(map,0,sizeof(map));
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&x[i],&y[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                map[i][j]=map[j][i]=sqrt(double(x[i]-x[j])*(x[i]-x[j])+double(y[i]-y[j])*(y[i]-y[j]));
            }
        }
        floyed();
        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",q++,map[1][2]);
    }
    return 0;
}

dijkstra算法:

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 300;
const int inf = 1e9;
int x[maxn],y[maxn];
double map[maxn][maxn];
double dis[maxn];
int vis[maxn];
int n;

void dj(int s)
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
    dis[s]=0;
    for(int i=1;i<=n;i++)
    {
        int minn=inf,k;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]<minn)
            {
                k=j;
                minn=dis[j];
            }
        }
        vis[k]=1;
        for(int j=1;j<=n;j++)
        {
            dis[j]=min(dis[j],max(dis[k],map[k][j]));
        }
    }
}

int main()
{
    int q = 1;
    while(~scanf("%d",&n)&&n)
    {
        memset(map,0,sizeof(map));
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&x[i],&y[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                map[i][j]=map[j][i]=sqrt(double(x[i]-x[j])*(x[i]-x[j])+double(y[i]-y[j])*(y[i]-y[j]));
            }
        }
        dj(1);
        printf("Scenario #%d\nFrog Distance = %.3lf\n\n",q++,dis[2]);
    }
    return 0;
}

 

poj2253

标签:sqrt   max   想去   http   turn   poj   解题思路   cstring   scanf   

原文地址:https://www.cnblogs.com/KasenBob/p/11408457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!