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, ...
随机推荐
- PAT 1009 说反话
https://pintia.cn/problem-sets/994805260223102976/problems/994805314941992960 给定一句英语,要求你编写程序,将句中所有单词 ...
- eclipse html 打开方式
1. HTML Editor是有HTML语法着色的模式(类似于Notepad++里的效果),适用于大的HTML,这样复制剪贴效率较高,且有语法高亮. 2.Web Page Editor图形设计模式,类 ...
- [转帖]以Windows服务方式运行.NET Core程序
以Windows服务方式运行.NET Core程序 原作者blog:https://www.cnblogs.com/guogangj/p/10093102.html 里面使用了NSSM 工具 但是自己 ...
- Oracle数据库 查看表是否是 索引组织表的方法
1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...
- Java多线程:用三个线程控制循环输出10次ABC
转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...
- 计算机cpu、寄存器、内存区别
1.寄存器是中央处理器内的组成部份.它跟CPU有关.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). ...
- Django-website 程序案例系列-18 多表跨表操作优化
详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 在数据库有外键的时候,使用 select_related() 和 pref ...
- 睡前小dp-poj1276-多重背包+二进制优化
http://poj.org/problem?id=1276 简单的多重背包,不过需要优化一下才能过.网上还有暴力的做法. 二进制优化在背包九讲里讲的比较清楚.对于多重背包的每一件物品,使用二进制的形 ...
- Maven依赖中的scope详解
scope的分类 compile 默认就是compile,什么都不配置也就是意味着compile.compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的 ...
- 如何注册CUBA Studio
拿着注册码不会注册,我也是醉了 运行Cuba Studio,然后在浏览器中打开,不要新建项目,这时右上角有一个英文[Register]和一个单选开关.如下: 这个英文不是这个单选开关的说明,它是一个超 ...