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, ...
随机推荐
- SyntaxHighlighter行号显示错误问题解决方案
SyntaxHighlighter是根据代码中的换行符分配行号的.但是,如果一行代码或者注释比较长,在页面显示时需要分成多行显示,会出现行号对不上的问题,像这样: 通过设置CSS强制不换行,可以保证行 ...
- vue-devtools 的安装和使用
vue-devtools的安装与使用 一.在github上下载压缩包,github下载地址:https://github.com/vuejs/vue-devtools 二.解压到本地的某盘 三.用你的 ...
- [转帖]/etc/security/limits.conf的含义
https://www.cnblogs.com/pzk7788/p/7250723.html /etc/security/limits.conf 是 Linux 资源使用配置文件,用来限制用户对系统资 ...
- 日常工作: 应用服务器Oracle驱动问题说明
1. .net使用Oracle驱动的发展等 作为.net线的产品的ERP产品 最初的版本 使用了.net 1.1发布时 微软提供的Oracle的驱动 但是后续微软的.net产品线貌似没有继续发展相应的 ...
- Windows系统下PHP使用Redis
参考链接:https://www.cnblogs.com/lhat/p/6402472.html 环境:windows 10 64位操作系统 php 5.4 redis 3.0 1.redis ...
- QA
QA:Quality Assurance,品质保证 IDQA:Individual Document Quality Assurance 设计品质保证 QE:Quantitative Easing 质 ...
- selenium之批量执行测试用例
把写好的测试用例放在指定目录下,使用discover函数扫描该目录,并根据关键字自动筛选需要执行的用例.本例使用Python3.6版本. # 遍历指定目录,批量执行测试用例 import unitte ...
- 16mysql1
一.数据库的基本概念 1.1 常用的关系型数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 1.2 sql语言 ...
- BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP
题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...
- Luogu2264 树上游戏(点分治)
要统计所有路径的信息,那我们考虑点分治,每次算经过分治中心的路径的贡献.然而路径的颜色数量实在是不好统计,既然只需要求从每个点出发的所有路径的颜色数量之和,那换一种思路,改为求从每个点出发包含某种颜色 ...