/**
旋转卡壳,,
**/
#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 两凸包间最近距离的更多相关文章

  1. ●POJ 3608 Bridge Across Islands

    题链: http://poj.org/problem?id=3608 题解: 计算几何,求两个凸包间的最小距离,旋转卡壳 两个凸包间的距离,无非下面三种情况: 所以可以基于旋转卡壳的思想,去求最小距离 ...

  2. POJ 3608 Bridge Across Islands(旋转卡壳,两凸包最短距离)

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7202   Accepted:  ...

  3. POJ 3608 Bridge Across Islands [旋转卡壳]

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10455   Accepted: ...

  4. poj 3608(旋转卡壳求解两凸包之间的最短距离)

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9768   Accepted: ...

  5. POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象

    给两个凸包,求这两个凸包间最短距离 旋转卡壳的基础题 因为是初学旋转卡壳,所以找了别人的代码进行观摩..然而发现很有意思的现象 比如说这个代码(只截取了关键部分) double solve(Point ...

  6. POJ 3608 Bridge Across Islands --凸包间距离,旋转卡壳

    题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..我直接默认顺时针给的点居然A ...

  7. POJ 3608 Bridge Across Islands (旋转卡壳)

    [题目链接] http://poj.org/problem?id=3608 [题目大意] 求出两个凸包之间的最短距离 [题解] 我们先找到一个凸包的上顶点和一个凸包的下定点,以这两个点为起点向下一个点 ...

  8. poj 3608 Bridge Across Islands

    题目:计算两个不相交凸多边形间的最小距离. 分析:计算几何.凸包.旋转卡壳.分别求出凸包,利用旋转卡壳求出对踵点对,枚举距离即可. 注意:1.利用向量法判断旋转,而不是计算角度:避免精度问题和TLE. ...

  9. POJ 3608 Bridge Across Islands(计算几何の旋转卡壳)

    Description Thousands of thousands years ago there was a small kingdom located in the middle of the ...

随机推荐

  1. C语言数据结构----栈与递归

    本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...

  2. 多版本jQuery的使用剖析

    </div> </div> <!-- basic scripts --> <!--[if !IE]> --> <!-- <![endi ...

  3. openStack deep dive,Retake Policy

    Method of Payment: visa MasterCard American Express Discover

  4. 自定义View编译失败。Binary XML file line #255: Error inflating

    02-28 15:17:16.281: DEBUG/AndroidRuntime(391): Shutting down VM 02-28 15:17:16.281: WARN/dalvikvm(39 ...

  5. ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候.事实上非常easy.仅仅须要知道3步骤: 1.測量- ...

  6. c++ 覆盖、重载、隐藏

    函数重载: 1.相同的范围内(即同一类中) 2.函数名相同: 3.参数不同: 4.virtual关键字可有可无: 函数覆盖:虚函数的功能.动态多态 (父类中必须有virtual)========派生类 ...

  7. 记WebUtility.HtmlDecode将&nbsp;转成特殊空格的问题

    在.net中 System.Web.HttpUtility.HtmlDecode(或者WebUtility.HtmlDecode) 方法会将   解码为特殊空格(Ascii值为,对应的值为:\u00A ...

  8. 解决mac 10.11 以后 无法使用未签名第三驱动

    解决 最新版 mac 系统 无法使用未签名第三驱动 10.12.多 我的情况是 10.11.4 Beta (15E27e) 使用绿联usb网卡不正常. 下面的命令为检测驱动是否装载的一些命令.sudo ...

  9. Java中Calender引用类型

    某些时候需要使用深拷贝: Calendar startTime = (Calendar) this._paramModel.getStartTime().clone(); 这样对startTime.a ...

  10. php知识(第2天)

    运算符 PHP中运算符一共分为9类: 赋值运算符, 算术运算符,比较运算符, 逻辑运算符, 错误抑制符, 三目运算符, 位运算符, 自操作运算符, 连接操作符 算术运算符 算术运算: 基本运算符: + ...