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 ...
随机推荐
- 转 C语言面试题大汇总
转 C语言面试题大汇总,个人觉得还是比较全地!!! \主 题: C语言面试题大汇总,个人觉得还是比较全地!!! 作 者: free131 (白日?做梦!) 信 誉 值: 100 ...
- JS闭包经典例题
上一篇文章谈论了闭包的概念和一些应用,并给出一个例题,这篇文章就此道例题进行讨论. function fun(n,o) { console.log(o); return { fun:function( ...
- IEEE 754标准
IEEE 754-1985 was an industry standard for representing floating-point numbers in computers, officia ...
- ZOJ 3080 ChiBi(spfa)
ZOJ Problem Set - 3080 ChiBi Time Limit: 5 Seconds Memory Limit: 32768 KB watashi's mm is so pr ...
- PHP_EOL换行符
换行符unix系列用 \nwindows系列用 \r\nmac用 \rPHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性
- [Jobdu] 题目1367:二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...
- BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )
首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...
- 我用过的Linux命令--修改主机名
下面的所有设置都是在CentOS中实验的,其他的Linux系统的玩法是一样的,只是配置文件的目录可能不一样. 局域网中的主机名类似于广域网中的域名,修改主机名有两种方式: (1)在当前会话中修改主机名 ...
- LintCode-比较字符串
题目描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 注意事项 在 A 中出现的 B 字符串里的字符不需要连续或者有序. 样例 给出 A = " ...
- step_by_step_G+入门-在线服务
第一步:先大概介绍下我们的窗体的布局框架,窗体大体分为以下3大块: 顶部:也就是大的模块划分(比如首页,软件管家,在线服务等) 内容区域:根据选择的不同的顶部模块,进行不同的内容展示: 底部:设置,下 ...