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 ...
随机推荐
- 多版本jQuery的使用剖析
</div> </div> <!-- basic scripts --> <!--[if !IE]> --> <!-- <![endi ...
- HDU 5741 Helter Skelter(构造法)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5741 [题目大意] 一个01相间的串,以0开头,给出的序列每个数字表示连续的0的个数或者1的个数, ...
- Codeforces 706D Vasiliy's Multiset(可持久化字典树)
[题目链接] http://codeforces.com/problemset/problem/706/D [题目大意] 要求实现一个集合中的三个操作,1:在集合中加入一个元素x,2:从集合中删除一个 ...
- POJ 3080 Blue Jeans(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=3080 [题目大意] 求k个串的最长公共子串,如果存在多个则输出字典序最小,如果长度小于3则判断查找失败. [题解] 将所有字符串通 ...
- BZOJ 无数据题集合
题目 http://www.lydsy.com/JudgeOnline/problem.php?id=1142 http://www.lydsy.com/JudgeOnline/problem.php ...
- stringstream字符串流
例题详解 題目:输入的第一行有一个数字 N 代表接下來有 N 行資料,每一行資料里有不固定個數的整數(最多 20 個,每行最大 200 個字元),請你寫一個程式將每行的总和印出來. 輸入: 3 1 2 ...
- Android开发_SQLite使用方法技巧
SQLite介绍 SQLite是轻量级的.嵌入式的.关系型数据库,目前已经在iPhone.Android等手机系统中使用,SQLite可移植性好,很容易使用,很小,高效而且可靠.SQLite嵌入到使用 ...
- 实习生的Django[1]
尽管学期尚未结束,暑假尚未到来,可是大三的同学非常多已经和我一样開始实习或者实习一段时间了.我仅仅面试了一间数据挖掘的公司的研发部,还算顺利通过. 来这里实习后,由于网络原因,昨天没有刷题也没有写BL ...
- ASP.NET之电子商务系统开发-3(订单)
一.前言 继上次的购物车,这是第三篇.记录一下订单功能.这功能做的时候,走过弯路,很是烧脑,因为思路没理顺,数据库设计的也不怎么好,做到一半才发现有问题,接着把数据库重新设计好,理清思路后,终于完成了 ...
- 《码农周刊》干货精选(Python 篇)
<码农周刊>已经累计发送了 38 期,我们将干货内容进行了精选.此为 Python 篇. <码农周刊>往期回顾:http://weekly.manong.io/issues/ ...