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, ...
随机推荐
- Docker查看容器IP
https://segmentfault.com/q/1010000001637726 https://blog.csdn.net/sannerlittle/article/details/77063 ...
- node的consoidate的插件统一
使用consolidate.ejs.的这种形式. let express = require('express'); let app = express(); app.set('views','返回的 ...
- thread run 和 start 的区别
run 方法 也可以调用线程启动 但是单线程(为顺序执行) 而start方法 启动的线程为多个线程之间争夺cpu的执行权(为随机的) 摘录于http://www.cnblogs.com/sunfl ...
- html 背景
用語設置背景的屬性 bgcolor設置背景顏色.可以使用名字.16進制和rgb三種形式的參數: <body bgcolor="#000000"> <body bg ...
- 19+ JavaScript 常用的简写技巧
博主说:对于任何基于 JavaScript 的开发人员来说,这绝对是一篇必读的文章,乃提升开发效率之神器也. 正文 js 1. 三元运算符 当你想用一行代码来写if...else语句的时候,使用三元操 ...
- 自学Linux Shell4.2-监测磁盘空间mount umount df du
点击返回 自学Linux命令行与Shell脚本之路 4.2-监测磁盘空间mount umount df du 1. 挂载存储媒体mount 移除存储媒体umount ls命令用于显示文件目录列表, ...
- SharePoint 2013 批量导入、删除帐号
删除一个group里所有的帐号: cls ########################### # "Enter the site URL here" $SITEURL = &q ...
- 【转】在单片机中,C语言的一些误用和总结!
在学习单片机的时候才真正知道C语言是什么,它是来干什么的~但是C语言用到嵌入式只是它小小的一部分应用,还有很多地方呢. 我们是不是在写程序的时候,错误很多就算编译通过了也达不到我们预期的结果,完了自己 ...
- luogu3385 负环 (spfa)
我在做spfa的时候,如果有一个点被更新了超过N次,证明这个图里是有负环的. (神TM输出YE5和N0) #include<bits/stdc++.h> #define pa pair&l ...
- Java NIO -- DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤:打开 DatagramChannel接收/发送数据 代码举例: package com.soyoungboy.n ...