Gym - 100851F Froggy Ford (Dijkstra)
题目链接: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)相关推荐
- Gym 100851F Froggy Ford(dijkstra)
题意 有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石板.在河的一岸有一只青蛙想通过石板跳到对岸去.现在可以在河 中间某个位置多加一块石板,使得在单步跳跃中的最大值最小. 思路 ...
- Gym - 100851F Froggy Ford kruskal
题目链接: http://acm.hust.edu.cn/vjudge/problem/307216 Froggy Ford Time Limit: 3000MS 题意 青蛙过河,河中有若干个石头,现 ...
- Gym - 100851F - Froggy Ford(dijkstra)
题目链接 参考 http://blog.csdn.net/KIJamesQi/article/details/52214990 题意 蛤蛤要从这岸去到对岸,河中有n块石头,现可以在河中添加一块石头 ...
- Gym - 100851F Froggy Ford
题目链接: http://codeforces.com/gym/100851/attachments 题解: 二分枚举长度,BFS暴力找路径,注意边界的处理 代码: #include <set& ...
- 【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford
题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置. 将原图视作完全图,二分答案mid,然后在图中只保留小于 ...
- Froggy Ford Gym - 100851F
http://codeforces.com/gym/100851/attachments 青蛙过河 n个石头 当作n个点 任意两点之间都有边 边的花费即为两点欧式距离 现在可以在任意位置加一个石头 使 ...
- 【最短路】NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...
- Gym-100851F Froggy Ford 最短路变形 dijkstra || spfa
题意:有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石头.在河的左岸有一只青蛙想通过石头跳到对岸去.现在可以在河中间某个位置多加一块石头,使得青蛙在单步跳跃中的最大值最小,问应在 ...
- 【最短路】NEERC15 F Froggy Ford (Codeforces GYM 100851)
题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...
最新文章
- [转]EOS智能合约 私链激活 基本操作
- 华为S2326 TP-EI交换机如何做端口镜像
- ubuntu 开放端口_Masscan端口扫描工具使用小手册
- Encapsulate Collection(封装集合)
- 企业微信_客户联系,获取客户及客户群列表及详情
- matlab中的显示精度
- 排序问题-fastjson-JSONObject
- 自定义Promise
- ubuntu 下WebStorm 无法输入中文
- matlab神经网络原理应用实例pdf,MATLAB神经网络原理与实例精解
- 微信小程序开发——单行文本溢出显示省略号
- Vue使用createWebHistory 页面刷新变成白页 解决
- You have to remove (or rename) that container to be able to reuse that name.
- CPU指令集存储位置在哪里?
- Linux 之父亮相,这个开源社区要“搞大事”
- java 系统api_java实现-强智教务系统API文档-时间信息
- Xiuno 简约白色主题
- UNIX Time Sharing System - UNIX分时系统翻译
- 【考研数学】高等数学知识点整理——第一章 函数、极限、连续
- 【论文阅读笔记】Simple and Lightweight Human Pose Estimation
热门文章
- Unity 垂直同步(V Sync)
- 使用juery使用ajax实现用户注册时的验证
- Linux相关知识的第十一回合
- 通过Ip得到城市实现步骤
- DS-第五章-二叉树的遍历
- JavaScript系列学习笔记 —— 正则表达式以及JS和Java的写法区别
- nw.js 软件推荐:AxeSlide斧子演示:PPT的另一种可能(转)
- 品牌对比 | 优衣库 VS UR
- 那些代码“神注释”,学妹看了立刻觉得程序员原来这么有趣……
- 在C#中解决动态计算表达式的问题(如字符串Sin(1)+Cos(2),执行并得出结果)