POJ 2253 - Frogger - [dijkstra求最短路]
Time Limit: 1000MS Memory Limit: 65536K
Description
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
Output
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
题解:
参考:http://www.cnblogs.com/tanhehe/p/3169865.html
另外请参考:http://blog.csdn.net/PKU_ZZY/article/details/52434239
Dijkstra算法模板:
const int INF=0x3f3f3f3f;
const int maxn=; int n; //n个节点
int d[maxn],edge[maxn][maxn];
bool vis[maxn]; //标记是否在集合S中 /*
集合V:图上所有节点
集合S:已经确定正确计算出d[]的节点
集合Q:V-S
*/
void dijkstra()
{
for(int i=;i<=n;i++) d[i]=(i==)?:INF;
memset(vis,,sizeof(vis)); for(int i=;i<=n;i++)
{
int mini=INF,u;
for(int j=;j<=n;j++)
{
if(!vis[j] && d[j]<mini) mini=d[(u=j)]; //寻找集合Q里d[u]最小的那个点u
}
vis[u]=; //放入集合S for(int v=;v<=n;v++)
{
if(!vis[v]) dist[v]=min(dist[v],dist[u]+edge[u][v]); //对集合Q中,所有与点u相连接的点进行松弛
}
}
}
AC代码:
#include<cstdio>
#include<cmath>
#define N 205
#define INF 1e60
double max(double a,double b){return a>b?a:b;}
double edge[N][N],d[N];
struct Point{
int x,y;
}point[N];
int n;
bool vis[N];
double dist(Point a,Point b){
return sqrt( (b.y-a.y)*(b.y-a.y) + (b.x-a.x)*(b.x-a.x) );
}
void init()
{
for(int i=;i<=n;i++)
{
if(i==) d[]=0.0 , vis[]=;
else d[i]=dist(point[],point[i]) , vis[i]=; for(int j=i;j<=n;j++)
{
edge[i][j]=edge[j][i]=dist(point[i],point[j]);
}
}
}
double dijkstra()
{
for(int i=;i<=n;i++)
{
double min=INF;int x;
for(int j=;j<=n;j++) if(!vis[j] && d[j] <= min) min=d[(x=j)];//找集合Q( Q=G.V - S )里d[x]最小的那个点x
vis[x]=;//把点x放进集合S里
for(int y=;y<=n;y++)//把在集合Q里所有与点x相邻的点都找出来松弛,因为这里青蛙可以在任意来两石头间跳,所以直接遍历 G.V - S 即可
{
if(!vis[y]){
double tmp = max(d[x], edge[x][y]);
if(d[y] > tmp) d[y] = tmp;
}
}
}
return d[];
}
int main()
{
int kase=;
while(scanf("%d",&n) && n!=)
{
for(int i=;i<=n;i++) scanf("%d%d",&point[i].x,&point[i].y);
init();
printf("Scenario #%d\n",++kase);
printf("Frog Distance = %.3f\n\n",dijkstra());
}
}
堆优化的Dijkstra算法:
const int maxn=;
const int INF=0x3f3f3f3f; int n,m; //n个节点,m条边 struct Edge
{
int u,v,w;
Edge(int u,int v,int w){this->u=u,this->v=v,this->w=w;}
};
vector<Edge> E;
vector<int> G[maxn];
void init(int l,int r)
{
E.clear();
for(int i=l;i<=r;i++) G[i].clear();
}
void addedge(int u,int v,int w)
{
E.push_back(Edge(u,v,w));
G[u].push_back(E.size()-);
} bool vis[maxn];
int d[maxn]; //标记是否在集合S中
void dijkstra(int st)
{
for(int i=;i<=n;i++) d[i]=(i==st)?:INF;
memset(vis,,sizeof(vis)); priority_queue< pair<int,int> > Q; //此处的Q即集合Q,只不过由于那些d[i]=INF根本不可能被选到,所以就不放到优先队列中
Q.push(make_pair(,st));
while(!Q.empty())
{
int now=Q.top().second; Q.pop(); //选取集合Q中d[x]最小的那个点x
if(vis[now]) continue; //如果节点x已经在集合S中,就直接略过
vis[now]=; //将节点x放到集合S中,代表节点x的d[x]已经计算完毕
for(int i=;i<G[now].size();i++) //松弛从节点x出发的边
{
Edge &e=E[G[now][i]]; int nxt=e.v;
if(vis[nxt]) continue;
if(d[nxt]>d[now]+e.w)
{
d[nxt]=d[now]+e.w;
Q.push(make_pair(-d[nxt],nxt));
}
}
}
}
POJ 2253 - Frogger - [dijkstra求最短路]的更多相关文章
- poj 2253 Frogger dijkstra算法实现
点击打开链接 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21653 Accepted: 7042 D ...
- POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)
题意:有两只青蛙,a在第一个石头,b在第二个石头,a要到b那里去,每种a到b的路径中都有最大边,求所有这些最大边的最小值.思路:将所有边长存起来,排好序后,二分枚举答案. 时间复杂度比较高,344ms ...
- POJ - 2253 Frogger 单源最短路
题意:给定n个点的坐标,问从第一个点到第二个点的最小跳跃范围.d(i)表示从第一个点到达第i个点的最小跳跃范围. AC代码 #include <cstdio> #include <c ...
- POJ 2253 Frogger(dijkstra 最短路
POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...
- POJ. 2253 Frogger (Dijkstra )
POJ. 2253 Frogger (Dijkstra ) 题意分析 首先给出n个点的坐标,其中第一个点的坐标为青蛙1的坐标,第二个点的坐标为青蛙2的坐标.给出的n个点,两两双向互通,求出由1到2可行 ...
- 最短路(Floyd_Warshall) POJ 2253 Frogger
题目传送门 /* 最短路:Floyd算法模板题 */ #include <cstdio> #include <iostream> #include <algorithm& ...
- POJ 2253 Frogger ,poj3660Cow Contest(判断绝对顺序)(最短路,floyed)
POJ 2253 Frogger题目意思就是求所有路径中最大路径中的最小值. #include<iostream> #include<cstdio> #include<s ...
- POJ 2253 Frogger (dijkstra 最大边最小)
Til the Cows Come Home 题目链接: http://acm.hust.edu.cn/vjudge/contest/66569#problem/A Description The i ...
- 关于dijkstra求最短路(模板)
嗯.... dijkstra是求最短路的一种算法(废话,思维含量较低, 并且时间复杂度较为稳定,为O(n^2), 但是注意:!!!! 不能处理边权为负的情况(但SPFA可以 ...
随机推荐
- java命令行操作
一直使用eclipse操作java程序,但RMI程序需要命令行操作,故研究了下java的命令行操作. javac 用于编译.java文件,生成.class文件 假设文件夹dir下有pa.java和a. ...
- 【GIS】Cesium GLTF
cd D:\GISSoft\3DsMax2017\COLLADA2GLTF-v2.1.4-windows-Release-x64 COLLADA2GLTF-bin.exe -f tree05.DAE ...
- JavaWeb学习总结(十五)Jsp中提交的表单的get和post的两种方式
两者的比较: Get方式: 将请求的参数名和值转换成字符串,并附加在原来的URL之后,不安全 传输的数据量较小,一般不能大于2KB: post方式: 数量较大: 请求的参数和值放在HTML的请求头中, ...
- Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance
在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer instance启动的时间不可控,很有可能超出coordinator确定 ...
- 通过java的i/o机制进行图片流的存储以及对网络图片的存储
存储内地图片思路:首先把原有的图片以流的方式读取出来,再以流的方式存储到目标文件: package imgStream; import java.io.*; public class ImgStrea ...
- 关于CreateProcess函数一些经验
TCHAR szCmdLine[]={TEXT("E:\\CPL-server\\其他工具\\restartSrv\\bin\\opensavepath.exe")}; TCHAR ...
- codeforces水题100道 第十九题 Codeforces Round #109 (Div. 2) A. I_love_%username% (brute force)
题目链接:http://www.codeforces.com/problemset/problem/155/A题意:找到当前最大值或者最小值出现的次数.“当前”的意思差不多是a[i]大于所有a[j]( ...
- 《转》win7 安装ujson 出现的“error: Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27”
本文转载自http://blog.csdn.net/Tilyp/article/details/72842800?locationNum=2&fps=1 我的python环境是 D:\work ...
- Web负载均衡与分布式架构
参考帖子: Web负载均衡的几种实现方式 大型网站架构系列:负载均衡详解(上) DNS 原理入门 解决nginx负载均衡的session共享问题 什么是消息队列 Java应用架构的演化之路 Java ...
- jquery 元素选择器集合
一.基本选择器 1. id选择器(指定id元素) 将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () { ...