Gym - 100851F - Froggy Ford(dijkstra)
参考 http://blog.csdn.net/KIJamesQi/article/details/52214990
题意
蛤蛤要从这岸去到对岸,河中有n块石头,现可以在河中添加一块石头,使得在单步跳跃中的最大值最小。
分析
dijkstra应用。开两维来表示路径中是否使用过额外的石头。dis[0][u]表示没用额外石头的最大最小,dis[1][u]则表示用了额外石头的最大最小。然后用dij的思想进行转移,dis[0][u]->dis[0][u],dis[0][u]->dis[1][u],dis[1][u]->dis[1][u].
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <ctype.h>
#include <queue>
using namespace std;
const int maxn=1e3+;
const int inf=0x3f3f3f3f;
const int mod=1e9+;
typedef long long ll; struct point{
double x,y;
void read(){
scanf("%lf%lf",&x,&y);
}
double operator ^(const point& rhs){
return sqrt((x-rhs.x)*(x-rhs.x)+(y-rhs.y)*(y-rhs.y));
}
}a[maxn]; struct Edge{
int v,nxt;
double dis;
}e[maxn*maxn*]; int head[maxn],tot;
void init(){
memset(head,-,sizeof(head));
tot=;
} void inline addEdge(int u,int v,double dis){
e[tot]=Edge{v,head[u],dis},head[u]=tot++;
e[tot]=Edge{u,head[v],dis},head[v]=tot++;
} double dis[][maxn];
int n,w;
struct node{
int u;
double md;
bool used;
point p;
bool operator < (const node&rhs) const {
return md>rhs.md||(md==rhs.md&& used>rhs.used);
}
}; void diji(){
for(int i=;i<=n+;i++) dis[][i]=dis[][i]=inf;
priority_queue<node> q;
q.push(node{,,false,point{,}});
dis[][]=;
while(!q.empty()){
node t=q.top();
q.pop();
int u=t.u;
if(u==n+){
printf("%.6f %.6f\n",t.p.x,t.p.y);
return;
}
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].v;
if(v==) continue;
if(t.used){
if(dis[][v]>max(t.md,e[i].dis)){
dis[][v]=max(t.md,e[i].dis);
q.push(node{v,dis[][v],true,t.p});
}
}else{
double x,y;
if(u!=&&v!=n+){
x=(a[u].x+a[v].x)/2.0;
y=(a[u].y+a[v].y)/2.0;
}
if(u==&&v!=n+){
x=a[v].x/2.0;
y=a[v].y;
}
if(u!=&&v==n+){
x=(w+a[u].x)/2.0;
y=a[u].y;
}
if(u==&&v==n+){
x=w/2.0;
y=;
}
if(dis[][v]>max(t.md,e[i].dis)){
dis[][v]=max(t.md,e[i].dis);
q.push(node{v,dis[][v],false,point{,}});
}
if(dis[][v]>max(t.md,e[i].dis/2.0)){
dis[][v]=max(t.md,e[i].dis/2.0);
q.push(node{v,dis[][v],true,point{x,y}});
}
}
}
}
} int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
freopen("froggy.in","r",stdin);
freopen("froggy.out","w",stdout);
scanf("%d%d",&w,&n);
for(int i=;i<=n;i++) a[i].read();
init();
int vs=,vt=n+;
addEdge(vs,vt,w);
for(int i=;i<=n;i++){
addEdge(vs,i,a[i].x);
addEdge(i,vt,w-a[i].x);
for(int j=i+;j<=n;j++)
addEdge(i,j,a[i]^a[j]);
}
if(n==){
printf("%.6f 0.000000\n",w/2.0);
}
else diji(); return ;
}
总结
对dij的思想掌握的不够啊,遇到这种题无从下手,还是太弱拉
Gym - 100851F - Froggy Ford(dijkstra)的更多相关文章
- Gym - 100851F Froggy Ford kruskal
题目链接: http://acm.hust.edu.cn/vjudge/problem/307216 Froggy Ford Time Limit: 3000MS 题意 青蛙过河,河中有若干个石头,现 ...
- 【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford
题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置. 将原图视作完全图,二分答案mid,然后在图中只保留小于 ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
- 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode
迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...
- 算法-迪杰斯特拉算法(dijkstra)-最短路径
迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...
- 数据结构与算法——迪杰斯特拉(Dijkstra)算法
tip:这个算法真的很难讲解,有些地方只能意会了,多思考多看几遍还是可以弄懂的. 应用场景-最短路径问题 战争时期,胜利乡有 7 个村庄 (A, B, C, D, E, F, G) ,现在有六个邮差, ...
- poj1062昂贵的聘礼(Dijkstra**)
/* 题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, ...
随机推荐
- Oracle 控制文件管理
控制文件是一个很小的二进制文件(10MB左右),含有数据库结构信息,包括数据文件和日志文件信息.控制文件在数据库创建时被自动创建,并在数据库发生物理变数时更新.控制文件被不断更新,在任何时候都要保证控 ...
- 传输层中的协议 TCP & UDP
面向连接的TCP协议 “面向连接”就是在正式通信前必须要与对方建立起连接.比如你给别人打电话,必须等线路接通了.对方拿起话筒才能相互通话.TCP(Transmission Control Protoc ...
- Linux标准输入、输出和错误和文件重定向 专题
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件.由于文件描述符不容易记忆,shell同时也给出了相应的文件名. 下面就是这些文件描述符及它们通常所 ...
- 服务器RAID设置以及简单理解
备注: 适用于测试环境,生产环境暂时未验证 1. RAID种类 最高性能的RAID0 完全拆分所有的IO 不进行校验 但是单盘损坏, 数据完全丢失 最高损耗的RAID1 损失一半的存储容量, 做镜像, ...
- modern effective C++ -- Deducint Types
1. 理解模板类型推导 1. expr是T& template<typename T> void f(T & param); // 我们声明如下变量 int x = 27; ...
- loadrunner分析结果二
5 worst transaction transaction name:事务名 failure ratio[%](exceeded time/transaction duration)失败率 (超标 ...
- map()实现zip()功能
c = (map(lambda x,y:(x,y),[1,2,3],["abd","def","ghi"]))print(list(c)) ...
- 部署AWStats分析系统
介绍 AWStats是使用Prel语言开发的一款开源日志分析系统,它不仅可以用来分析Apache网站服务器的访问日志,也可以用来分析Samba.Vsftpd.IIS等服务的日志信息. AWStats软 ...
- BZOJ3123[Sdoi2013]森林——主席树+LCA+启发式合并
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...
- 斜率DP个人理解
斜率DP 斜率DP的一版模式:给你一个序列,至多或分成m段,每段有花费和限制,问符合情况的最小花费是多少: 一版都用到sum[],所以符合单调,然后就可以用斜率优化了,很模板的东西: 如果看不懂可以先 ...