您的位置:首页 > 其它

poj 2187 Beauty Contest (凸包)

2013-03-08 17:44 405 查看
题目:http://poj.org/problem?id=2187

题意:给定平面上的一些散点集,求最远两点距离的平方值。

基于水平序的Andrew算法(Graham算法的变种)

1、按照x从小到大排序(如果x相同就按照y从小到大排序),删除重复点后得到序列p1,p2,。。。。

2、把p1和p2放到凸包中。从p3开始,当新点在凸包的前进方向的左边时继续,否则依次删除最近加入凸包的点,直到新点在左边。

3、依次枚举凸包的的任意两点,求出最大距离的平方

View Code

#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps=1e-6;
typedef struct node
{
int x,y;
}point;
int n;
point pt[50010];
point res[50010];
bool cmp(point a,point b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
int dcml(double x)
{
if(fabs(x)<eps)
return 0;
if(x<0)
return -1;
else
return 1;
}
double dot(int x1,int y1,int x2,int y2)
{
return x1*y2-x2*y1;
}
int cross(point a,point b,point c)
{
return dcml(dot(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y));
}
int dist(point a,point b)
{
return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
{
scanf("%d%d",&pt[i].x,&pt[i].y);
}
sort(pt,pt+n,cmp);
int m;
m=0;
for(i=0;i<n;i++)
{
while(m>1&&cross(res[m-1],pt[i],res[m-2])<=0)
m--;
res[m++]=pt[i];
}
int k=m;
for(i=n-2;i>=0;i--)
{
while(m>k&&cross(res[m-1],pt[i],res[m-2])<=0)
m--;
res[m++]=pt[i];
}
if(n>1)
m--;
int dis=0;
int j;
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
int h=dist(res[i],res[j]);
if(dis<h)
dis=h;
}
}
printf("%d\n",dis);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: