题目链接:http://poj.org/problem?id=3608

题意:求两个多边形的最近对踵点对。(已知两个多边形不相交)

思路:模板。

View Code #include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#define min(x,y) ((x)<(y)?(x):(y))using namespace std;struct point{double x,y;point(){}point(double _x,double _y){x=_x;y=_y;}void get(){scanf("%lf%lf",&x,&y);}};const double EPS=1e-8;const int MAX=10005;point p[MAX],q[MAX],p1[MAX],q1[MAX],temp;int n,m,N,M;int DB(double x){if(x>EPS) return 1;if(x<-EPS) return -1;return 0;}double Dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}//判断p在向量ab的哪一侧//右侧:返回正值//左侧:返回负值//在向量ab上返回0double cross(point a,point b,point p){return (b.x-a.x)*(p.y-a.y)-(b.y-a.y)*(p.x-a.x);}int cmp(point a,point b){double x=Dis(a,temp),y=Dis(b,temp);int flag=DB(cross(temp,a,b));if(flag) return flag==1;return DB(x-y)<=0;}void Graham(point p[],int n,point q[],int &m){point t;int i,k=0,a,b;for(i=1;i<n;i++){a=DB(p[i].y-p[k].y);b=DB(p[i].x-p[k].x);if(a==-1||!a&&b==-1) k=i;}if(k!=0) t=p[0],p[0]=p[k],p[k]=t;temp=p[0];sort(p+1,p+n,cmp);q[0]=p[0];q[1]=p[1];p[n]=p[0];m=2;for(i=2;i<=n;i++){while(m>1&&DB(cross(q[m-2],q[m-1],p[i]))<=0) m--;q[m++]=p[i];}m--;}double getAngle(point a1,point a2,point b1,point b2){point t;t.x=b2.x-b1.x+a1.x;t.y=b2.y-b1.y+a1.y;return cross(a1,a2,t);}double Dis1(point a,point p,point q){double t1=(q.x-p.x)*(a.x-p.x)+(q.y-p.y)*(a.y-p.y);double t2=(p.x-q.x)*(a.x-q.x)+(p.y-q.y)*(a.y-q.y);if(DB(t1)!=-1&&DB(t2)!=-1) return fabs(cross(a,p,q))/Dis(p,q);return min(Dis(a,p),Dis(a,q));}//凸包最近对踵点double calMinDis(point p[],int n,point q[],int m){int sp=0,sq=0,i,a,b,tp,tq;double ans,flag;for(i=0;i<n;i++){a=DB(p[i].y-p[sp].y);b=DB(p[i].x-p[sp].x);if(a==-1||!a&&b==-1) sp=i;}for(i=0;i<m;i++){a=DB(q[i].y-q[sq].y);b=DB(q[i].x-q[sq].x);if(a==1||!a&&b==1) sq=i;}ans=Dis(p[sp],q[sq]);tp=sp;tq=sq;do{flag=DB(getAngle(p[sp],p[(sp+1)%n],q[sq],q[(sq+1)%m]));if(flag==0){ans=min(ans,Dis1(p[sp],q[sq],q[(sq+1)%m]));ans=min(ans,Dis1(p[(sp+1)%n],q[sq],q[(sq+1)%m]));ans=min(ans,Dis1(q[sq],p[sp],p[(sp+1)%n]));ans=min(ans,Dis1(q[(sq+1)%m],p[sp],p[(sp+1)%n]));sp=(sp+1)%n;sq=(sq+1)%m;}else if(flag==-1){ans=min(ans,Dis1(q[sq],p[sp],p[(sp+1)%n]));sp=(sp+1)%n;}else{ans=min(ans,Dis1(p[sp],q[sq],q[(sq+1)%m]));sq=(sq+1)%m;}}while(tp!=sp||tq!=sq);return ans;}int main(){while(scanf("%d%d",&n,&m),n||m){int i;for(i=0;i<n;i++) p[i].get();for(i=0;i<m;i++) q[i].get();Graham(p,n,p1,N);Graham(q,m,q1,M);double ans=calMinDis(p1,N,q1,M);printf("%.5lf\n",ans);}return 0;}

  

POJ 3608 Bridge Across Islands(凸包最近对踵点对)相关推荐

  1. POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3608 Bridge Across Islands跨岛大桥:在两个凸包小岛之间造桥,求最小距离?3.6与平面和空间打交道的计 ...

  2. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

  3. poj 3608 旋转卡壳求不相交凸包最近距离;

    题目链接:http://poj.org/problem?id=3608 #include<cstdio> #include<cstring> #include<cmath ...

  4. POJ 2187 Beauty Contest( 凸包求最远点对 )

    链接:传送门 题意:给出 n 个点,求出这 n 个点中最远的两个点距离的平方 思路:最远点对一定会在凸包的顶点上,然后直接暴力找一下凸包顶点中距离最远的两个点 /******************* ...

  5. POJ 1873 The Fortified Forest 凸包 二进制枚举

    n最大15,二进制枚举不会超时.枚举不被砍掉的树,然后求凸包 #include<stdio.h> #include<math.h> #include<algorithm& ...

  6. POJ 3608 旋转卡壳

    思路: 旋转卡壳应用 注意点&边  边&边  点&点 三种情况 //By SiriusRen #include <cmath> #include <cstdi ...

  7. poj 2573 Bridge(有A、B、C、D四个人,要在夜里过一座桥……)

    微软面试题题目大意:有A.B.C.D四个人,要在夜里过一座桥.他们通过这座桥分别需要耗时1.2.5.10分钟,只有一支手电,并且同时最多只能两个人一起过桥. 请问,如何安排,能够在17分钟内这四个人都 ...

  8. POJ 计算几何入门题目推荐

      其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...

  9. [Z]POJ 计算几何入门题目推荐[转PKKJ]

    http://www.cnblogs.com/eric-blog/archive/2011/05/31/2064785.html http://hi.baidu.com/novosbirsk/blog ...

最新文章

  1. xilinxaxi ethernet 硬件时间戳告警
  2. 64位十六进制转浮点数
  3. tp3.2php开启事务,Thinkphp 3.2.3 开启调试模式
  4. Fluid 0.5 版本:开启数据集缓存在线弹性扩缩容之路
  5. P3348-[ZJOI2016]大森林【LCT】
  6. 写在WinHEC开幕之际:沿着Windows我们一路走来
  7. 如何在 Mac 上设置 iCloud 功能?
  8. Atiitt 提升复用性之道 项目成本之道 Atitit 代码复用的理解attilax总结 1. 复用分类 1 1.1. 类库侧重代码重用,框架侧重设计重用 2 2. 文档与索引体系 2 3
  9. android so劫持,防劫持SDK
  10. 川崎机器人示教盒维修_阳江市川崎机器人示教器维修中心
  11. protel99se原理图设计,怎样显示隐藏的“PART TYPE”?
  12. 线性可变位移传感器行业调研报告 - 市场现状分析与发展前景预测
  13. 连接mysql提示不允许连接_用数据库工具连接mysql出现不允许连接的解决办法
  14. 什么是web前端?前端可以做什么?html5有什么用?
  15. 分享如何跟进转化客户,提高成单率
  16. HDU 2448 Mining Station on the Sea(Floyd+最优匹配)
  17. 完美的Pornhub风格的Logo生成器,在线工具
  18. Python 之 = [:] copy deepcopy
  19. 【Linux】linux的网络配置(动态IP与静态IP)
  20. 关于ADS调参比较好的方式

热门文章

  1. 用html如何把页面分割成多个文件,由多个文件拼接而成?
  2. 思科1832I/1852I/2802/3802无线AP卡死不通电无射频故障维修
  3. 灰色关联分析法(GRA)-C++实现
  4. 实时主备出现GRP02[STANDBY, OPEN, ISTAT_SAME:TRUE]的归档状态无效或到实例GRP01[PRIMARY, OPEN, ISTAT_SAME:TRUE]的MAL链路异常
  5. 共发射极放大电路---工作
  6. 机器学习中的异常检测
  7. 计算机桌面怎么突然变大了,电脑桌面比例突然变大?一招还原比例!
  8. C++中模板类中的成员函数以及模板函数在类外定义
  9. bzoj1925【sdoi2010】地精部落
  10. centos开启服务器端口