博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)
阅读量:6243 次
发布时间:2019-06-22

本文共 4194 字,大约阅读时间需要 13 分钟。

Frogger
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 24879   Accepted: 8076

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

20 03 4317 419 418 50

Sample Output

Scenario #1Frog Distance = 5.000Scenario #2Frog Distance = 1.414

Source

解题思路:

对着题意不长的英文看了好几遍,才明确什么叫 the frog distance . 抓狂

有N块石头。1—N。每块石头都有x,y坐标,青蛙一号站在第一块石头上,青蛙二号站在第二块石头上,青蛙一号想要通过这N块石头去找青蛙二号,由于青蛙一号能够踩在不论什么一块石头上,所以从第一块石头到第二块石头有非常多条路径,如果为X,在每一条路径中,都有跳跃范围(即在这条路径中,两块石头之间的最大距离),那么一共同拥有X个跳跃范围。我们要求的就是这X个跳跃范围的最小值。就是the frog distance。   比方有  有两条通路  1(4)5 (3)2 代表1到5之间的边为4,  5到2之间的边为3。那么该条通路跳跃范围(两块石头之间的最大距离)为 4,  还有一条通路 1(6) 4(1) 2 ,该条通路的跳跃范围为6, 两条通路的跳跃范围各自是 4 ,6,我们要求的就是最小的那一个跳跃范围,即4.

边的遍历和点值的更新。这个点值代表的是,从1号石头到第[i]块石头的frog distance。

用floyed算法和dijkstra算法,把更新点值的语句修改一下就能够。

代码:

floyed:

#include 
#include
#include
#include
#include
using namespace std;const int maxNode=210;double mp[maxNode][maxNode];int nodeNum;struct P{ int x,y;}point[maxNode];double dis(P a,P b){ return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));}void floyed(){ for(int k=1;k<=nodeNum;k++) for(int i=1;i<=nodeNum;i++) for(int j=1;j<=nodeNum;j++) mp[i][j]=min(mp[i][j],max(mp[i][k],mp[k][j]));//很多通路中最长边中的最小边}int main(){ int c=1; while(cin>>nodeNum&&nodeNum) { for(int i=1;i<=nodeNum;i++) cin>>point[i].x>>point[i].y; for(int i=1;i<=nodeNum;i++) for(int j=i+1;j<=nodeNum;j++) { mp[i][j]=mp[j][i]=dis(point[i],point[j]); } floyed(); cout<<"Scenario #"<
<
dijkstra:

#include 
#include
#include
#include
#include
using namespace std;const int maxn=210;const int inf=0x3f3f3f3f;double mp[maxn][maxn];double dist[maxn];bool vis[maxn];int n;struct P{ int x,y;}point[maxn];double dis(P a,P b){ return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));}void dijkstra(int start){ memset(vis,0,sizeof(vis)); //memset(dist,inf,sizeof(dist)); for(int i=1;i<=n;i++) dist[i]=inf; dist[start]=0; for(int i=1;i<=n;i++) { int MinNum,Min=inf; for(int j=1;j<=n;j++) if(!vis[j]&&dist[j]
>n&&n) { for(int i=1;i<=n;i++) cin>>point[i].x>>point[i].y; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { mp[i][j]=mp[j][i]=dis(point[i],point[j]); } dijkstra(1); cout<<"Scenario #"<
<
注意:  double 数组 就不要轻易用memset复制了。还得考虑字节长度。

你可能感兴趣的文章
8、Python —— 输入输出
查看>>
我的友情链接
查看>>
[转]Shell 统计PV, UV ,独立IP
查看>>
Flash网页甘特图控件
查看>>
yii2 csrf验证以及token管理
查看>>
一步一步理解Java企业级应用的可扩展性
查看>>
存储非结构化数据之利器-minio
查看>>
苹果个人开发者账号申请
查看>>
SSH双机互信及错误解决大全
查看>>
adb命令详解
查看>>
php网页如何运作
查看>>
学艺不精 - 记一次性能问题排查
查看>>
Provisioning Services 7.6 入门到精通系列之五:PVS控制台安装
查看>>
awk工具
查看>>
设计模式-代理模式(Proxy)
查看>>
Windows Sharepoint services 3.0部署体验
查看>>
[分享] Mac 键盘和Pc键盘对照表
查看>>
windows下批量杀死进程
查看>>
第七章:面向对象(三)
查看>>
android-ripple-background
查看>>