Gym - 100851F Froggy Ford kruskal

题目链接:

http://acm.hust.edu.cn/vjudge/problem/307216

Froggy Ford


Time Limit: 3000MS

题意

青蛙过河,河中有若干个石头,现在你可以加一个石头,使得青蛙从左岸跳到右岸的最大跳跃距离最小。

题解

把左岸和右岸作为两个虚节点,用kruskal的思路处理出每个点到左岸需要跳跃的最大距离st[i](最优情况下)和每个点到右岸的最大距离ed[i],然后枚举两个点,在这两个点的中点放一个石头,得到ma=max(st[i],ed[j],dis(i,j)/2),如果这个值比答案更优,就更新答案,同时记录新放的石头的坐标。

代码

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;const int INF=0x3f3f3f3f;
const LL INFL=9e18;
const double eps=1e-8;const int maxn=1111;LL w,n;pair<LL,LL> pt[maxn];LL dis(LL x1,LL y1,LL x2,LL y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}struct Edge{int u,v; LL w;Edge(int u,int v,LL w):u(u),v(v),w(w){}Edge(){}bool operator < (const Edge& tmp) const {return w<tmp.w;}
}egs[maxn*maxn];int tot;
int fa[maxn];
int find(int x){return fa[x]=fa[x]==x?x:find(fa[x]);
}vector<int> G[maxn];
int st[maxn],ed[maxn];void init(){clr(st,-1);clr(ed,-1);tot=0;rep(i,0,maxn) fa[i]=i;rep(i,0,maxn) G[i].push_back(i);
}int main() {freopen("froggy.in","r",stdin);freopen("froggy.out","w",stdout);init();scanf("%I64d%I64d",&w,&n);rep(i,1,n+1) scanf("%I64d%I64d",&pt[i].X,&pt[i].Y);rep(i,1,n+1){egs[tot++]=Edge(0,i,pt[i].X*pt[i].X);}rep(i,1,n+1){egs[tot++]=Edge(i,n+1,(w-pt[i].X)*(w-pt[i].X)); }rep(i,1,n+1){rep(j,i+1,n+1){egs[tot++]=Edge(i,j,dis(pt[i].X,pt[i].Y,pt[j].X,pt[j].Y));}}egs[tot++]=Edge(0,n+1,w*w);egs[tot++]=Edge(0,0,0);egs[tot++]=Edge(n+1,n+1,0);sort(egs,egs+tot);rep(i,0,tot){int u=egs[i].u,v=egs[i].v;if(u==0&&v==0){st[0]=i; continue;}if(u==n+1&&v==n+1){ed[n+1]=i; continue;}int pu=find(u);int pv=find(v);if(pu!=pv){if(find(0)==pu){rep(j,0,G[pv].size()){int tt=G[pv][j];st[tt]=i;}}else if(find(0)==pv){rep(j,0,G[pu].size()){int tt=G[pu][j];st[tt]=i;}}if(find(n+1)==pu){rep(j,0,G[pv].size()){int tt=G[pv][j];ed[tt]=i;}}else if(find(n+1)==pv){rep(j,0,G[pu].size()){int tt=G[pu][j];ed[tt]=i;}}fa[pv]=pu;while(G[pv].size()>0){G[pu].push_back(G[pv][G[pv].sz()-1]);G[pv].pop_back();}}}int ans_i=0,ans_j=0;double mi=9000000000000000000;rep(i,0,n+2){rep(j,0,n+2){if(i==j) continue;double tmp=max(egs[st[i]].w,egs[ed[j]].w);int ti=i,tj=j;if(ti>tj) swap(ti,tj);if(ti==0&&tj==n+1){tmp=max(tmp,w*w*1.0/4);}else if(ti==0){tmp=max(tmp,pt[tj].X*pt[tj].X*1.0/4);}else if(tj==n+1){tmp=max(tmp,(w-pt[ti].X)*(w-pt[ti].X)*1.0/4);}else{tmp=max(tmp,dis(pt[i].X,pt[i].Y,pt[j].X,pt[j].Y)*1.0/4);}if(tmp<mi){mi=tmp;ans_i=i; ans_j=j;}}}double ans_x=0,ans_y=0;if(ans_i>ans_j) swap(ans_i,ans_j);if(ans_i==0&&ans_j==n+1){ans_x=w*1.0/2;ans_y=0;}else if(ans_i==0){ans_x=pt[ans_j].X*1.0/2;ans_y=pt[ans_j].Y;}else if(ans_j==n+1){ans_x=(w+pt[ans_i].X)*1.0/2;ans_y=pt[ans_i].Y;}else{ans_x=(pt[ans_i].X+pt[ans_j].X)*1.0/2;ans_y=(pt[ans_i].Y+pt[ans_j].Y)*1.0/2; }printf("%.3lf %.3lf\n",ans_x,ans_y);return 0;
}

转载于:https://www.cnblogs.com/fenice/p/5769356.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tesseract入门-VS2015下调用Tesseract4.0 +win7 64位系统

本文是基于最近的OCR识别项目学习ocr开源库-tesseract的简单调用&#xff0c;不涉及其余视觉知识。 参考文献&#xff1a;http://blog.csdn.net/u012566751/article/details/54136836 参考库&#xff1a;http://download.csdn.net/download/u010554381/10044876 1.预备工作 …

authconfig命令解析_学习笔记

时间&#xff1a;2017.11.16作者&#xff1a;李强参考&#xff1a;man,info&#xff0c;magedu讲义声明&#xff1a;以下英文纯属个人翻译&#xff0c;英文B级&#xff0c;欢迎纠正&#xff0c;盗版不纠,才能有限&#xff0c;希望不误人子弟为好。1、使用目的与场景先列在这里&…

matlab simulinK笔记06——代数环

★代数环 代数环,就是由于模型的输出反馈到模块或子系统的某个输入端&#xff0c;如果这个输入 是直接馈入的&#xff0c;那么二者在同一个采样点内需得到求解&#xff0c;但又互相依赖,哪一方都不 能完成求解过程&#xff0c;使得解算器无法解算导致错误产生&#xff0c;这样的…

PHP多种序列化/反序列化的方法 (转载)

1. serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数。 <?php$a array(a > Apple ,b > banana , c > Coconut);//序列化数组 $s serialize($a); echo $s; //输出结果&#xff1a;a:3:{s:1:"a";s:5:"Apple";s:1:&qu…

基于python3的Opencv(一)-打开摄像头显示图像

基于Python3的Opencv学习&#xff1a; import cv2 as cv def video_demo(): #0是代表摄像头编号&#xff0c;只有一个的话默认为0capturecv.VideoCapture(0) while(True):ref,framecapture.read()cv.imshow("1",frame) #等待30ms显示图像&#xff0c;若过程中按“Esc…

.Net中的AOP系列之《方法执行前后——边界切面》

返回《.Net中的AOP》系列学习总目录 本篇目录 边界切面 PostSharp方法边界方法边界 VS 方法拦截ASP.NET HttpModule边界真实案例——检查是否为移动端用户真实案例——缓存小结本系列的源码本人已托管于Coding上&#xff1a;点击查看。 本系列的实验环境&#xff1a;VS 2013 Up…

matlab simulink笔记06 —— 利用simulink求解微分方程/simulink框图与控制系统框图的区别

目录 1.利用integrator求解微分方程 1.1求解步骤 1.2例子 2.simulink框图与控制系统框图的区别 本人刚开始学习simulink,总是会将simulink框图和控制系统框图混淆,导致最后不能正确的根据simulink框图得到相应的微

ubuntu搭建svn、git遇到的问题及解决办法

不错的git笔记博客&#xff1a; http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git学习教程&#xff08;六&#xff09;Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 图解git http://my.oschina.net/x…

PHP IDE phpstorm 快捷键

这篇文章主要介绍了PHP IDE phpstorm 常用快捷键,本文分别列出了mac系统和Windows系统下的phpstorm快捷键,需要的朋友可以参考下 一、mac电脑phpstorm快捷键 command a 全选 command c 复制 command v 粘贴 command z 撤消 command k 代码搜索 command l 输入行号跳到某一…

Opencv SolvePnP调用实战

1.环境说明与应用说明 VS2015opencv3.4&#xff0c;实际应用在MFC环境中&#xff01;主要是用来做定位&#xff0c;利用平面靶标给机器人的工具快换提供定位信息 2.实际调用 CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints, …

matlab simulink笔记05 —— 积分模块

1.连续积分模块&#xff1a;integrator 例子见&#xff1a;matlab simulink笔记06 —— 利用simulink求解微分方程/simulink框图与控制系统框图的区别

squid在企业网中的应用

一&#xff1a;squid简介&#xff1a; Squid是一种在Linux系统下使用的优秀的代理服务器软件。Squid是一个缓存internet数据的一个软件&#xff0c;它接收用户的下载申请&#xff0c;并自动处理所下载的数据。也就是说&#xff0c;当一个用户想要下载一个主页时&#xff0c;它向…

win10+tensorflow faster-RCNN 训练自己的数据集

首先&#xff0c;感谢博客上各路大佬的无私奉献&#xff01;但是也不得不吐槽下&#xff0c;大佬些写博客的时候能尽量写的对小白友好一点吗&#xff1f;期间遇到各种坑&#xff0c;说多了都是泪啊&#xff01;话不多说&#xff0c;上正题&#xff01; 环境&#xff1a;win10a…

matlab simulnk笔记07——模块(接地模块group、终止模块terminal、信号合并mux与分解模块demux)

1.接地模块group 2.终止模块terminal 3.信号合并mux 注意:合并仅仅指的是物理上的合并,数学上真正意义上的合并,只是将多个信号放在同一个管道上统一传输给显示终端,但是每个信号之间互不影响,是相

二叉搜索树的插入与删除图解

一、二叉搜索树&#xff08;BSTree&#xff09;的概念 二叉搜索树又被称为二叉排序树&#xff0c;那么它本身也是一棵二叉树&#xff0c;那么满足以下性质的二叉树就是二叉搜索树&#xff1a;1、若左子树不为空&#xff0c;则左子树上左右节点的值都小于根节点的值2、若它的右子…

AlienVault Ossim各版本镜像下载地址

AlienVault Ossim各版本镜像下载地址 OSSIM V5.0.3 ISO网盘下载地址 了解Ossim的架构、工作原理和使用方法可以参考我的新书以及http://edu.51cto.com/course/course_id-1186.html 这里提供的视频教程。 本文转自 李晨光 51CTO博客&#xff0c;原文链接&#xff1a;http://blo…

面试总结

lru算法&#xff1a;最近最少使用  1.新数据插入到链表头部&#xff1b;  2.每当缓存命中&#xff08;即缓存数据被访问&#xff09;&#xff0c;则将数据移到链表头部&#xff1b;  3.当链表满的时候&#xff0c;将链表尾部的数据丢弃。 自定义控件&#xff1a; 1.measu…

win10+anaconda安装tensorflow和keras遇到的坑小结

win10下利用anaconda安装tensorflow和keras的教程都大同小异&#xff08;针对CPU版本&#xff0c;我的gpu是1050TI的MAX-Q&#xff0c;不知为啥一直没安装成功&#xff09;&#xff0c;下面简单说下步骤。 一 Anaconda安装 一般来说&#xff0c;python选择3.6的&#xff0c;目…

rman备份恢复命令之switch

一 switch 命令 1 switch命令用途 更新数据文件名为rman下镜像拷贝时指定的数据文件名 更新数据文件名为 set newname 命令指定的名字。 2 switch 命令使用前提条件 rman 必须连接到目标数据库 当switch tablespaces、datafiles、tempfiles时&#xff0c;这些文件必须离线 当…