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, ...
随机推荐
- windows上面链接使用linux上面的docker daemon
1. 修改linux 上面的 docker的 配置文件. vim /usr/lib/systemd/system/docker.service 注意 这个是centos的路径 发现ubuntu的路径不 ...
- DOM中表格的操作方法总结
DOM中表格的操作方法总结 <table/>元素的方法如下: caption:指向<caption/>元素(如果存在): tBodies:<tbody/>元素的集合 ...
- override overload reintroduce的区别(delphi)
1.override overload reintroduce的中文叫法是什么? override:覆盖:overload:重载:Reintroduce:重定义 2.在子类中override或ov ...
- selenium之封装登陆操作
# selenium 封装登录操作举例 import os, time # from selenium import webdriver class LoginPage(): '''登录模块''' d ...
- js 单项链表
介绍链表 链表是由一组节点组成的集合.每一个节点都使用一个对象的引用指向它的后续借点.指向另外一个借点的引用叫做链. 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组 ...
- 谷歌pixel手机解BL锁、刷机、破解电信(史上最详细的帖子)
本文根据网上已有内容进行整理,对每一个步骤都进行了实践,运气爆棚,几乎没有出现什么重大错误,小错误也进行了很好地解决.因此,十分感激那些为折腾google pixel的IT爱好者,为我提供了无穷的帮助 ...
- Spark_RDD之RDD操作简介
1.转化操作 转化操作是返回一个新的RDD的操作,我们可以使用filter()方法进行转化.举个使用scala进行转化操作的例子. def main(args: Array[String]): Uni ...
- [代码]--c#实现屏幕取词源码下载
最近公司有一个 项目需要实现类似于金山词霸,有道词典等的屏幕取词功能,准确来说是划词功能,网上搜了各种屏幕取词无外乎就两种: A.金山词霸组件法 B.Nhw32.dll法 百度搜到的重复内容真的太多了 ...
- [IOI2018]会议——分治+线段树
题目链接: [IOI2018]meetings 题目大意:有$n$座山峰,每座山峰有一个高度,有$q$次询问,每次需要确定一个开会山峰使$[l,r]$所有山峰上的人都前往开会山峰,一个山峰的人去开会的 ...
- Fantasy of a Summation LightOJ - 1213 (快速幂)
题意: 首先 只看第一层循环的A[0],是不是用了nk-1次 A[1]也是用了nk-1次······ 所以 第一层的sum(A[i]的和) 一共用了nk-1 所以第一层为sum * nk-1 因为又 ...