题目链接:https://cn.vjudge.net/problem/Gym-100851F

这道题是POJ-2253的升级版:https://blog.csdn.net/GYH0730/article/details/77510915

在POJ2253的基础上要加上一个点,显然这个点要加在两点的中点处,提前预处理出任意一点到S,到T的所有路径上最大边的最小值,然后我们可以枚举所有的边,答案为min(max(ds[u], w(u,v)/2, dt[v] ),记录一下最小值就行了

细节上要注意边界的处理

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1050;
const double INF = 1e18;
struct Edge
{int from,to;double dist;Edge(int u,int v,double d):from(u),to(v),dist(d) {}
};
struct HeapNode
{double d;int u;HeapNode(int _u,double _d):u(_u),d(_d){}bool operator < (const HeapNode& rhs) const{return d > rhs.d;}
};
struct Dijkstra
{int n,m;vector<Edge> edges;vector<int> G[MAXN];bool vis[MAXN];double dis[MAXN];void init(int n){this -> n = n;for(int i = 0; i <= n + 1; i++) G[i].clear();edges.clear();}void AddEdge(int from,int to,double dist){edges.push_back(Edge(from,to,dist));m = edges.size();G[from].push_back(m - 1);}void dijkstra(int s){priority_queue<HeapNode> Q;for(int i = 0; i <= n + 1; i++) {dis[i] = INF;vis[i] = false;}dis[s] = 0.0;Q.push(HeapNode(s,0.0));while(!Q.empty()) {HeapNode x = Q.top();Q.pop();int u = x.u;if(vis[u]) continue;vis[u] = true;for(int i = 0; i < G[u].size(); i++) {Edge& e = edges[G[u][i]];if(dis[e.to] > max(dis[u],e.dist)) {dis[e.to] = max(dis[u],e.dist);Q.push(HeapNode(e.to,dis[e.to]));}}}}
}ds,dt;
struct Point
{double x,y;
}p[MAXN];
inline double cal(int i,int j)
{return sqrt( (p[i].x - p[j].x) * (p[i].x - p[j].x) +(p[i].y - p[j].y) * (p[i].y - p[j].y));
}
int main(void)
{freopen("froggy.in","r",stdin);freopen("froggy.out","w",stdout);double w,temp;int n;scanf("%lf %d",&w,&n);ds.init(n);dt.init(n);int S = 0,T = n + 1;for(int i = 1; i <= n; i++) {scanf("%lf %lf",&p[i].x,&p[i].y);}for(int i = 1; i <= n; i++) {ds.AddEdge(S,i,p[i].x);dt.AddEdge(i,S,p[i].x);ds.AddEdge(i,T,w - p[i].x);dt.AddEdge(T,i,w - p[i].x);for(int j = i + 1; j <= n; j++) {temp = cal(i,j);ds.AddEdge(i,j,temp);ds.AddEdge(j,i,temp);dt.AddEdge(i,j,temp);dt.AddEdge(j,i,temp);}}ds.dijkstra(S);dt.dijkstra(T);double ansx = 0,ansy = 0;double ans = INF;int ax,ay;for(int i = S; i <= T; i++) {for(int j = S; j <= T; j++) {if(i == j) continue;if(i == S && j != T) temp = p[j].x;else if(i != S && j == T) temp = w - p[i].x;else if(i == S && j == T) temp = w;else temp = cal(i,j);if(ans > max(max(ds.dis[i],temp / 2),max(temp / 2,dt.dis[j]))) {ax = i;ay = j;ans = max(max(ds.dis[i],temp / 2),max(temp / 2,dt.dis[j]));if(i != S && j != T) {ansx = (p[i].x + p[j].x) * 0.5;ansy = (p[i].y + p[j].y) * 0.5;}if(i == S && j != T) {ansx = p[j].x * 0.5;ansy = p[j].y;}if(i != S && j == T) {ansx = (p[i].x + w) * 0.5;ansy = p[i].y;}if(i == S && j == T) {ansx = w * 0.5;ansy = 0;}}}}printf("%.12lf %.12lf\n",ansx,ansy);return 0;
}
/*
10 7
2 2
2 4
5 1
5 3
8 2
7 5
9 4
*/

Gym - 100851F Froggy Ford (Dijkstra)相关推荐

  1. Gym 100851F Froggy Ford(dijkstra)

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

  2. Gym - 100851F Froggy Ford kruskal

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

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

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

  4. Gym - 100851F Froggy Ford

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

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

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

  6. Froggy Ford Gym - 100851F

    http://codeforces.com/gym/100851/attachments 青蛙过河 n个石头 当作n个点 任意两点之间都有边 边的花费即为两点欧式距离 现在可以在任意位置加一个石头 使 ...

  7. 【最短路】NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)

    题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...

  8. Gym-100851F Froggy Ford 最短路变形 dijkstra || spfa

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

  9. 【最短路】NEERC15 F Froggy Ford (Codeforces GYM 100851)

    题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...

最新文章

  1. [转]EOS智能合约 私链激活 基本操作
  2. 华为S2326 TP-EI交换机如何做端口镜像
  3. ubuntu 开放端口_Masscan端口扫描工具使用小手册
  4. Encapsulate Collection(封装集合)
  5. 企业微信_客户联系,获取客户及客户群列表及详情
  6. matlab中的显示精度
  7. 排序问题-fastjson-JSONObject
  8. 自定义Promise
  9. ubuntu 下WebStorm 无法输入中文
  10. matlab神经网络原理应用实例pdf,MATLAB神经网络原理与实例精解
  11. 微信小程序开发——单行文本溢出显示省略号
  12. Vue使用createWebHistory 页面刷新变成白页 解决
  13. You have to remove (or rename) that container to be able to reuse that name.
  14. CPU指令集存储位置在哪里?
  15. Linux 之父亮相,这个开源社区要“搞大事”
  16. java 系统api_java实现-强智教务系统API文档-时间信息
  17. Xiuno 简约白色主题
  18. UNIX Time Sharing System - UNIX分时系统翻译
  19. 【考研数学】高等数学知识点整理——第一章 函数、极限、连续
  20. 【论文阅读笔记】Simple and Lightweight Human Pose Estimation

热门文章

  1. Unity 垂直同步(V Sync)
  2. 使用juery使用ajax实现用户注册时的验证
  3. Linux相关知识的第十一回合
  4. 通过Ip得到城市实现步骤
  5. DS-第五章-二叉树的遍历
  6. JavaScript系列学习笔记 —— 正则表达式以及JS和Java的写法区别
  7. nw.js 软件推荐:AxeSlide斧子演示:PPT的另一种可能(转)
  8. 品牌对比 | 优衣库 VS UR
  9. 那些代码“神注释”,学妹看了立刻觉得程序员原来这么有趣……
  10. 在C#中解决动态计算表达式的问题(如字符串Sin(1)+Cos(2),执行并得出结果)