题意:有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石头。在河的左岸有一只青蛙想通过石头跳到对岸去。现在可以在河中间某个位置多加一块石头,使得青蛙在单步跳跃中的最大值最小,问应在哪里加。

思路:将左岸抽象成原点,右岸抽象成目标点,原点到任意石头(x, y)的距离都是x,目标点到任意石头的距离都是w - x,任意两石头之间的距离就是他们坐标的欧氏距离,按此建图,跑一个dijkstra,维护最小的最大跳跃距离,dis[u][0]代表没加过石头的答案,dis[u][1]代表加过石头的答案,转移的时候考虑全面一点就好了(详见代码)。

最后计算答案的时候还要注意特判左岸和右岸的情况。

也可以跑spfa,不过因为这是个稠密图,不推荐spfa,硬要写的话最好加上SLF优化。详见:点击打开链接

代码:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define showtime printf("time = %.15f\n",clock() / (double)CLOCKS_PER_SEC);
using namespace std;
typedef pair<double,double> P;
const int MAXN = 1010;
const double eps = 1e-8;
P p[MAXN];
struct edge{int v;double w;edge(int _v = 0, double _w  = 0) : v(_v), w(_w) {}
};
vector<edge> mp[MAXN];
void addedge(int u, int v, double w)
{mp[u].push_back(edge(v, w));mp[v].push_back(edge(u, w));
}
double get_dis(P a, P b)
{return sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second));
}struct node{int v, l, r;//l, r 表示石头加在l,r线段的中点位置bool flag; // 是否已经添加过点 double dis;node(){}node(int _v, int _l, int _r, bool _fg, double _dis) : v(_v), l(_l), r(_r), flag(_fg), dis(_dis) {}bool operator < (node a) const{//if(fabs(dis - a.dis) < eps) return flag > a.flag;return dis > a.dis;}
};
int W, n;
priority_queue<node> q;
double dis[MAXN][2];
void dijkstra()
{int v, ansl, ansr; double w, tmp, ans_dis = inf;for(int i = 0; i <= n + 1; i++) dis[i][0] = dis[i][1] = inf;q.push(node(0, 0, 0, 0, 0));dis[0][0] = 0;while(!q.empty()){node u = q.top(); q.pop();if(dis[u.v][u.flag] < u.dis) continue;if(u.v == n + 1 && ans_dis > u.dis)ans_dis = u.dis, ansl = u.l, ansr = u.r;for(int i = 0; i < mp[u.v].size(); i++){v = mp[u.v][i].v; w = mp[u.v][i].w;if(u.flag){tmp = max(w, u.dis);if(dis[v][1] > tmp){dis[v][1] = tmp;q.push(node(v, u.l, u.r, 1, tmp));}}else{tmp = max(u.dis, w);if(dis[v][0] > tmp){dis[v][0] = tmp;q.push(node(v, 0, n + 1, 0, tmp));}tmp = max(u.dis, w * 1.0 / 2);if(!u.flag && dis[v][1] > tmp){dis[v][1] = tmp;q.push(node(v, u.v, v, 1, tmp));}}}}if(ansl > ansr) swap(ansl, ansr);p[0].first = 0; p[n + 1].first = W;if(ansl == 0) p[ansl].second = p[ansr].second;if(ansr == n + 1) p[ansr].second = p[ansl].second;printf("%.1lf %.1lf", (p[ansl].first + p[ansr].first) * 1.0 / 2, (p[ansl].second + p[ansr].second) * 1.0 / 2);
}
int main()
{freopen("froggy.in", "r", stdin);freopen("froggy.out", "w", stdout);cin >> W >> n;addedge(0, n + 1, W);for(int i = 1; i <= n; i++){scanf("%lf %lf", &p[i].first, &p[i].second);addedge(0, i, p[i].first);addedge(i, n + 1, W - p[i].first);for(int j = 1; j < i; j++)addedge(i, j, get_dis(p[i], p[j]));}dijkstra();return 0;
}


Gym-100851F Froggy Ford 最短路变形 dijkstra || spfa相关推荐

  1. Gym - 100851F Froggy Ford kruskal

    题目链接: http://acm.hust.edu.cn/vjudge/problem/307216 Froggy Ford Time Limit: 3000MS 题意 青蛙过河,河中有若干个石头,现 ...

  2. Gym 100851F Froggy Ford(dijkstra)

    题意 有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石板.在河的一岸有一只青蛙想通过石板跳到对岸去.现在可以在河 中间某个位置多加一块石板,使得在单步跳跃中的最大值最小. 思路 ...

  3. Gym - 100851F Froggy Ford (Dijkstra)

    题目链接:https://cn.vjudge.net/problem/Gym-100851F 这道题是POJ-2253的升级版:https://blog.csdn.net/GYH0730/articl ...

  4. Gym - 100851F - Froggy Ford(dijkstra)

    题目链接 参考   http://blog.csdn.net/KIJamesQi/article/details/52214990 题意 蛤蛤要从这岸去到对岸,河中有n块石头,现可以在河中添加一块石头 ...

  5. Gym - 100851F Froggy Ford

    题目链接: http://codeforces.com/gym/100851/attachments 题解: 二分枚举长度,BFS暴力找路径,注意边界的处理 代码: #include <set& ...

  6. 【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford

    题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置. 将原图视作完全图,二分答案mid,然后在图中只保留小于 ...

  7. poj 2253 最短路变形——最大边的最小值

    文章目录 本题:最短路变形--最大边的最小值 最短路变形--最小边的最大值 本题:最短路变形--最大边的最小值 题意: 给出两只青蛙.以及其他石头的坐标,需要求出可以到达另一只青蛙的所有路径中,青蛙跳 ...

  8. 最短路算法详解(Dijkstra/SPFA/Floyd)

    转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...

  9. 【图论-最短路变形】想越狱的小杉

    [图论-最短路变形]想越狱的小杉 Time Limit:1000MS  Memory Limit:65536K Description 背景 Background 这次小杉来到了经典美剧<越狱& ...

最新文章

  1. 产品经理技能树之 数据体系
  2. AngularJS 最佳实践
  3. storm_常用命令
  4. 算法:螺旋矩阵 ||
  5. [GYM 100492A] Average Convex Hull 凸包好题
  6. 从零学前端第十四讲:AngularJs进阶-作用域和控制器
  7. 【Python基础】学习Python 一定要吃透这 5 个内置函数
  8. Swift之深入解析如何结合Core Data和SwiftUI
  9. 神奇的计算器dc和bc
  10. 前端学习(3014):vue+element今日头条管理--表单验证基本使用2
  11. 结语|日拱一卒无有尽,功不唐捐终入海
  12. 一步一步学Linq to sql(十):分层构架的例子
  13. 38.django的路由系统
  14. 发力多人在线游戏!PS5有望2020年E3展会亮相!
  15. Nginx 注册为 windows服务
  16. 统计年鉴29份3种格式混合
  17. bigworld引擎
  18. 搜索引擎优化、常用SEO优化方法总结
  19. CEPH告警:health_warn 45 pgs degraded;60 pgs unclean; 45 pgs undersized
  20. 通过Excel制作下拉框筛选出成绩

热门文章

  1. 2022新H5即时通讯聊天系统源码+带群聊/有APP
  2. 信息学竞赛中常用名词
  3. Github 上 365 道 Java 高频面试复习题,助你吊打面试官
  4. 腾讯云轻量应用服务器搭建LAMP 开发环境
  5. 开始使用DirectX 12进行渲染画图
  6. 道路车辆先进驾驶辅助系统ADAS常用略缩语
  7. 连封面都是递归——《你好哇,程序员——漫话程序员面试求职、升职加薪、创业与生活》
  8. 安卓推送一体解决方案
  9. Bug管理工具(TCE)快速入门
  10. 三年三个大台阶 贝斯平(Bespin Global)将如何改变云管理行业?