poj 3608 Bridge Across Islands 两凸包间最近距离
/**
旋转卡壳,,
**/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std; const double eps = 1e-;
struct point {
double x,y;
point(double x=,double y =):x(x),y(y){}
}; int dcmp(double x){
if(fabs(x)<eps)
return ;
else
return x<?-:;
} point p[],p1[];
point q[],q1[];
int maxid,minid;
int N,M;
typedef point Vector; Vector operator -(point a,point b){
return Vector(a.x-b.x,a.y-b.y);
} double cross(Vector a,Vector b){
return a.x*b.y-a.y*b.x;
} double dot(Vector a,Vector b){
return a.x*b.x+a.y*b.y;
}
bool cmp(point a,point b){
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
} bool operator ==(const point &a,const point &b){
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
} double length(Vector a){
return sqrt(a.x*a.x+a.y*a.y);
} int convexHull(point *p,int n,point *ch){
sort(p,p+n,cmp);
int m =;
for(int i=;i<n;i++){
while(m>&&cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)
m--;
ch[m++] = p[i];
}
int k =m;
for(int i = n-;i>=;i--){
while(m>k&&cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)
m--;
ch[m++] = p[i];
}
if(n>) m--;
return m;
} double distanceToSegment(point p,point a,point b){
if(a==b)
return length(p-a);
Vector v1 = b-a,v2 = p-a, v3 = p-b;
if(dcmp(dot(v1,v2))<)
return length(v2);
else if(dcmp(dot(v1,v3))>)
return length(v3);
else
return fabs(cross(v1,v2))/length(v1);
} double distanceBetweenSegment(point a,point b,point c,point d){
return min(min(distanceToSegment(a,c,d),distanceToSegment(b,c,d)),min(distanceToSegment(c,a,b),distanceToSegment(d,a,b)));
} void getMaxAndMin(int &maxid,int &minid){
maxid =;
minid =;
for(int i=;i<N;i++){
if(p1[i].y<p1[minid].y)
minid =i;
}
for(int i=;i<M;i++){
if(q1[i].y>q1[maxid].y)
maxid = i;
}
} double solve(point *p,point *q,int minid,int maxid,int N,int M){
double temp,ret = 1e5;
p[N] = p[];
q[M] = q[];
for(int i=;i<N;i++){
while(temp = dcmp(cross(q[maxid]-q[maxid+],p[minid+]-p[minid]))>){
maxid = (maxid+)%M;
}
if(temp<)
ret = min(ret,distanceToSegment(q[maxid],p[minid],p[minid+]));
else
ret = min(ret,distanceBetweenSegment(p[minid],p[minid+],q[maxid],q[maxid+]));
minid = (minid+)%N;
}
return ret;
} int main()
{ while(cin>>N>>M){
if(N==&&M==)
break;
for(int i=;i<N;i++)
cin>>p[i].x>>p[i].y;
for(int i=;i<M;i++)
cin>>q[i].x>>q[i].y;
N = convexHull(p,N,p1);
M = convexHull(q,M,q1);
getMaxAndMin(maxid,minid);
double ans = solve(p1,q1,minid,maxid,N,M);
printf("%.5lf\n",ans);
}
return ;
}
poj 3608 Bridge Across Islands 两凸包间最近距离的更多相关文章
- ●POJ 3608 Bridge Across Islands
题链: http://poj.org/problem?id=3608 题解: 计算几何,求两个凸包间的最小距离,旋转卡壳 两个凸包间的距离,无非下面三种情况: 所以可以基于旋转卡壳的思想,去求最小距离 ...
- POJ 3608 Bridge Across Islands(旋转卡壳,两凸包最短距离)
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7202 Accepted: ...
- POJ 3608 Bridge Across Islands [旋转卡壳]
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10455 Accepted: ...
- poj 3608(旋转卡壳求解两凸包之间的最短距离)
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9768 Accepted: ...
- POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象
给两个凸包,求这两个凸包间最短距离 旋转卡壳的基础题 因为是初学旋转卡壳,所以找了别人的代码进行观摩..然而发现很有意思的现象 比如说这个代码(只截取了关键部分) double solve(Point ...
- POJ 3608 Bridge Across Islands --凸包间距离,旋转卡壳
题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..我直接默认顺时针给的点居然A ...
- POJ 3608 Bridge Across Islands (旋转卡壳)
[题目链接] http://poj.org/problem?id=3608 [题目大意] 求出两个凸包之间的最短距离 [题解] 我们先找到一个凸包的上顶点和一个凸包的下定点,以这两个点为起点向下一个点 ...
- poj 3608 Bridge Across Islands
题目:计算两个不相交凸多边形间的最小距离. 分析:计算几何.凸包.旋转卡壳.分别求出凸包,利用旋转卡壳求出对踵点对,枚举距离即可. 注意:1.利用向量法判断旋转,而不是计算角度:避免精度问题和TLE. ...
- POJ 3608 Bridge Across Islands(计算几何の旋转卡壳)
Description Thousands of thousands years ago there was a small kingdom located in the middle of the ...
随机推荐
- elk 日志处理的一点思路
zjtest7-frontend:/usr/local/logstash-2.3.4/bin# ./logstash -f ../config/logstash_agent.conf zjtest7- ...
- 关于结构体和C++类的内存地址问题
关于结构体和C++类的内存地址问题 今天终于有时间写点东西了~ 太爽了 *_* 很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样 ...
- openStack openSource CloudComputing
<一,> ,OpenStack a few Core Compontents integration with openStack-keystone Identity service1.1 ...
- Nothing2
重压下似乎找不到释放的出口. 拳套早已封存, 竹箫也非常久不去碰它, 如今预计已然吹不出心弦之曲, 围棋的造诣也退步到家了. 是不是仅仅有当思路电光石火, 当指尖快如闪电, 当键盘上舞动的手指跟上思想 ...
- LCM Cardinality
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31675#problem/E 暴力 // File Name: uva10892.cpp ...
- iPhone开发之全局变量的使用
全局变量历来就是很好的东西,能够在开发中带来很多方便,下面来介绍一下iPhone中软件开发时全局变量的使用方法: 一.新建Constants.h文件(文件名根据需要自己取),用于存放全局变量: 二.在 ...
- Node.js模块os
OS 操作系统模块 os.hostname() 操作系统的主机名. os.type() 操作系统的名称 os.release() 操作系统的发行版本 os.uptime() 当前系统的时间 以秒为 o ...
- iOS实践02
第二天了,上了一天课,软件测试.数据挖掘.概率论,晚上了才有时间捣鼓捣鼓程序. 今天只是简单的做了一点.觉得自己思考的写不出来,只能简单的写一个过程,不像第一次写这个,少了很多思考的. 1.完善tab ...
- jsp 有哪些动作?作用分别是什么?
答:JSP 共有以下 6 种基本动作jsp:include: 在页面被请求的时候引入一个文件.jsp:useBean: 寻找或者实例化一个 JavaBean.jsp:setProperty: 设置 J ...
- Problem E: Automatic Editing
Problem E: Automatic EditingTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Status ...