【旋转卡壳】poj3608 Bridge Across Islands
给你俩凸包,问你它们的最短距离。
咋做就不讲了,经典题,网上一片题解。
把凸包上的点逆时针排序。可以取它们的平均点,然后作极角排序。
旋转卡壳其实是个很模板化的东西……
先初始化分别在凸包P和Q上取哪个点,一般在P上取纵坐标最小的点,在Q上取纵坐标最大的点
for i=1 to n(n是凸包P上的点数)
{
while(两条边的叉积>0)
{
凸包Q上的点++
}
计算当前两条边之间的答案(或者说每条边的2个端点到另一条边的答案)
凸包P上的点++
}
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define EPS 0.0000000001
struct Point
{
double x,y;
Point(){}
Point(const double &X,const double &Y)
{
x=X;
y=Y;
}
double Length()
{
return sqrt(x*x+y*y);
}
}p[2][10010],bao[2][10010],ave;
typedef Point Vector;
Vector operator - (const Point &a,const Point &b)
{
return Vector(a.x-b.x,a.y-b.y);
}
bool cmp (const Point &a,const Point &b)
{
return atan2((a-ave).y,(a-ave).x)<atan2((b-ave).y,(b-ave).x);
}
double Cross(const Vector &a,const Vector &b)
{
return a.x*b.y-a.y*b.x;
}
double Dot(const Vector &a,const Vector &b)
{
return a.x*b.x+a.y*b.y;
}
double calc(Point P,Point A,Point B)
{
Vector v1=B-A,v2=P-A,v3=P-B;
if(Dot(v1,v2)<EPS) return v2.Length();
else if(Dot(v1,v3)>(-EPS)) return v3.Length();
else return fabs(Cross(v1,v2))/v1.Length();
}
int n,m;
int main()
{
//freopen("y.in","r",stdin);
while(1)
{
scanf("%d%d",&n,&m);
if(n==0 && m==0)
break;
for(int i=0;i<n;++i)
{
scanf("%lf%lf",&p[0][i].x,&p[0][i].y);
ave.x+=p[0][i].x;
ave.y+=p[0][i].y;
}
ave.x/=(double)n;
ave.y/=(double)n;
for(int i=0;i<m;++i)
scanf("%lf%lf",&p[1][i].x,&p[1][i].y);
sort(p[0],p[0]+n,cmp);
ave.x=ave.y=0;
for(int i=0;i<m;++i)
{
ave.x+=p[1][i].x;
ave.y+=p[1][i].y;
}
ave.x/=(double)m;
ave.y/=(double)m;
sort(p[1],p[1]+m,cmp);
int nowP=0,nowQ=0;
for(int i=1;i<n;++i)
if(p[0][i].y-p[0][nowP].y<(-EPS))
nowP=i;
for(int i=1;i<m;++i)
if(p[1][i].y-p[1][nowQ].y>EPS)
nowQ=i;
double ans=1000000000000000007.0;
for(int i=0;i<n;++i)
{
while(Cross(p[1][(nowQ+1)%m]-p[1][nowQ],p[0][nowP]-p[0][(nowP+1)%n])>EPS)
nowQ=(nowQ+1)%m;
ans=min(ans,
min(calc(p[0][nowP],p[1][nowQ],p[1][(nowQ+1)%m]),
min(calc(p[0][(nowP+1)%n],p[1][nowQ],p[1][(nowQ+1)%m]),
min(calc(p[1][nowQ],p[0][nowP],p[0][(nowP+1)%n]),
calc(p[1][(nowQ+1)%m],p[0][nowP],p[0][(nowP+1)%n])))));
nowP=(nowP+1)%n;
}
printf("%.5lf\n",ans);
}
return 0;
}
【旋转卡壳】poj3608 Bridge Across Islands的更多相关文章
- poj3608 Bridge Across Islands
地址:http://poj.org/problem?id=3608 题目: Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536 ...
- 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)
题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...
- POJ 3608 Bridge Across Islands(计算几何の旋转卡壳)
Description Thousands of thousands years ago there was a small kingdom located in the middle of the ...
- POJ 3608 Bridge Across Islands(旋转卡壳,两凸包最短距离)
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7202 Accepted: ...
- POJ 3608 Bridge Across Islands --凸包间距离,旋转卡壳
题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..我直接默认顺时针给的点居然A ...
- POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象
给两个凸包,求这两个凸包间最短距离 旋转卡壳的基础题 因为是初学旋转卡壳,所以找了别人的代码进行观摩..然而发现很有意思的现象 比如说这个代码(只截取了关键部分) double solve(Point ...
- POJ 3608 Bridge Across Islands [旋转卡壳]
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10455 Accepted: ...
- POJ 3608 Bridge Across Islands (旋转卡壳)
[题目链接] http://poj.org/problem?id=3608 [题目大意] 求出两个凸包之间的最短距离 [题解] 我们先找到一个凸包的上顶点和一个凸包的下定点,以这两个点为起点向下一个点 ...
- Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离
\(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...
随机推荐
- 用DOM解析XML ,用xpath快速查询XML节点
XPath是一种快速查询xml节点和属性的一种语言,Xpath和xml的关系就像是sql语句和数据库的关系.用sql语句可以从数据库中快速查询出东西同样的用xPath也可以快速的从xml中查询出东西. ...
- ActiveMQ(2) ActiveMQ创建HelloWorld
启动ActiveMQ: 请参见:ActiveMQ(1) 初识ActiveMQ 创建Maven工程: pom文件: <project xmlns="http://maven.apache ...
- flume高级组件及各种报错
1,one source two channel 创建conf文件,内容如下: #定义agent名, source.channel.sink的名称 access.sources = r1 access ...
- bzoj1251: 序列终结者 fhqtreap写法
fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...
- 稀疏编码概率解释(基于1996年Olshausen与Field的理论 )
一.Sparse Coding稀疏编码 稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据.稀疏编码算法的目的就是找到一组基向量 ,使得我们能将输入向量 表示为这些 ...
- ThinkPHP 多应用多模块建立方式
ThinkPHP3.2.2及以后版本同一应用多模块和多应用多模块的设计已经比以前的版本更加简单快捷. 注:入口文件为index.php,内容为: <?php // +-------------- ...
- exec,eval
一.什么是Exec语句 假如我们一串字符串里面有Python代码,这个时候,普通情况是会把这串代码作为字符串来输出的,而不会执行这段代码.如果此时,我们想执行这串字符串里面的python代码,使用Ex ...
- RtlInitUnicodeString
代码1: WCHAR enumeratorName[] = {}; UNICODE_STRING unicodeEnumName; RtlInitUnicodeString(&unicodeE ...
- HDU1068 (二分图最大匹配匈牙利算法)
Girls and Boys Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Centos 7.2 双网卡绑定之踩坑
线上服务器,安装centos7.2 x64最小化安装,需要做链路聚合,双网卡绑定.在centos 6.x 和 centos 7上测试都OK,于是直接开搞. 说明下,以下环境是在虚拟机中实现的: 系统: ...