Frogger
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 55388   Accepted: 17455

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 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

传送门:点击打开链接

题目大意:一只青蛙要从点1到点2,给你n个坐标,问你青蛙要达到终点,单次跳跃的最短距离是多少。

思路:一开始想到二分,感觉很麻烦,然后想到djkstra算法里的dis【】,一般我们用这个dis表示从起点点集到某一个点的最短总距离,现在我们可以用dis来表示,从起点点集到某一个点单次跳跃的最短距离,所以有了

for(int j=1;j<=n;j++){
if(!vis[j])
dis[j]=min(dis[j],max(g[p][j],dis[p]));
}

其实就是用三角形,1,p,j三个点,dis【j】要么是本身,要么是另外两条边最大的那一条。

核心思想就是这样,其他的没什么坑点了。然后上完整代码。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#define ll long long
using namespace std;
const int maxn=210;
const int INF=0x3f3f3f3f;
struct dian {
double x,y;
} a[maxn];
double g[maxn][maxn];
double dis[maxn];
int vis[maxn],n;
void djks(){
for(int i=1;i<=n;i++){
dis[i]=g[1][i];
}
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=1;i<n;i++){
double minn=INF;
int p;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<minn){
p=j;
minn=dis[j];
}
}
vis[p]=1;
for(int j=1;j<=n;j++){
if(!vis[j])
dis[j]=min(dis[j],max(g[p][j],dis[p]));//核心 用三角形的思路来松弛
}
}
}
int main() {
int cas=1;
while(scanf("%d",&n),n) {
memset(g,INF,sizeof(g));
for(int i=1; i<=n; i++) {
scanf("%lf%lf",&a[i].x,&a[i].y);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
double x=a[i].x-a[j].x;
double y=a[i].y-a[j].y;
g[i][j]=g[j][i]=pow(x*x+y*y,0.5);
}
}
djks();
printf("Scenario #%d\n",cas++);
printf("Frog Distance = %.3f\n\n",dis[2]);
}
}

poj2253青蛙(可到达路径的单次跳跃最短距离)的更多相关文章

  1. [LeetCode] Frog Jump 青蛙过河

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  2. POJ2253 Frogger

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34865   Accepted: 11192 Descrip ...

  3. P1052 过河 线性dp 路径压缩

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  4. 【洛谷】P1052 过河【DP+路径压缩】

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...

  5. poj2253 Frogger dijkstra

    题目大意: 给出n个岛的坐标,前两个坐标分别为A青蛙和B青蛙所在岛的坐标,A青蛙想到达B青蛙所在的岛,A可以从某一个岛跳到任意其它一个岛上,则A到B的每条路径都有一个跳的最远的距离Xi,求这些最远距离 ...

  6. TOJ 2710: 过河 路径压缩

    2710: 过河  Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByteTotal Submit: 32         ...

  7. [LeetCode] 882. Reachable Nodes In Subdivided Graph 细分图中的可到达结点

    Starting with an undirected graph (the "original graph") with nodes from 0 to N-1, subdivi ...

  8. NOIP 2005 青蛙过河

    做题记录:2016-08-10 21:58:09 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都 ...

  9. ooj 1066 青蛙过河DP

    http://121.249.217.157/JudgeOnline/problem.php?id=1066 1066: 青蛙过河 时间限制: 1 Sec  内存限制: 64 MB提交: 58  解决 ...

随机推荐

  1. matlab读取excel

    xlsread函数: x = xlsread('d:/min1.csv','B2:B10');    %文件名和路径:所读取的数据范围:

  2. 【译】Android 数据库 ORMLite

    @DatabaseField cloumnName:指定字段名,不指定则变量名作为字段名  canBeNull:是否可以为null   dataType:指定字段的类型 defaultValue:指定 ...

  3. to_date() 、to_char()、to_number的FMT格式

     元素  含义 结果:2018/01/12(周五) -     /    ,    .     ;    :  (6中不同分隔符) 分隔符         y  显示一位年份  8 yy  显示二位年 ...

  4. Android getWidth和getMeasuredWidth的区别

    getWidth 得到的事某个View的实际尺寸. getMeasuredWidth 得到的是某个View想要在parent view里面占的大小 相比你也见过这样的解释,听起来这样的解释也是云里雾里 ...

  5. unity3d MonoDevelop引用外部自定义dll文件报错:are you missing an assembly reference?

    在unity3d 编辑器 MonoDevelop 中引用外部自定义dll文件报错:are you missing an assembly reference? 因为unity还停留在.NET Fram ...

  6. PCL—关键点检测(iss&Trajkovic)低层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5069311.html 关键点检测往往需要和特征提取联合在一起,关键点检测的一个重要性质就是旋转不变性,也就是说,物 ...

  7. c++ 子类切勿重新定义父类 non-virtual函数

    子类如果重新定义了父类的non-virtual函数则不会有多态效果. 为方便描述,这里的方法和继承方式都用public.至于原因嘛,你懂的! 1:子类直接继承父类方法 class BaseOption ...

  8. js获取指定小时日期格式化

    不得不感叹一下,聪明的程序员写的代码真是让人惊奇 找了一圈格式化代码的方式,下面的这个使用了一个 slice 函数,真是厉害 https://stackoverflow.com/questions/4 ...

  9. 解决eclipse的source not found change at.

    eclise快捷键F3跳转到类的实现方法,出现如图所示问题:source not found change  atttached  source.点击下图红圈,Change Attached  Sou ...

  10. 【转】基于OCS实现高速缓存

    OCS简介 OCS( Open Cache Service)为分布式高速缓存服务,主要实现热点数据的快速响应: OCS支持Key/Value的数据结构,兼容memcachebinary protoco ...