您的位置:首页 > 其它

最远点对 凸包 POJ 2187

2012-08-08 11:11 211 查看
/article/2843528.html

模版:

平均时间复杂度O(nlgn),最坏O(n * n)

View Code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
#define MAXN 200010
using namespace std;

struct point
{
int x;
int y;
}p[50005];

int top,stack[50005];

inline int max(int a,int b)
{
return a>b?a:b;
}

inline int dis(const point a,const point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

inline int mult(const point p1,const point p2,const point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int cmp(const void *a,const void *b)
{
point *p1=(point*)a;
point *p2=(point*)b;
if(mult(*p1,*p2,p[0])<0)
return 1;
else if(mult(*p1,*p2,p[0])==0 && (*p1).x>(*p2).x)
return 1;
else return -1;
}

void graham(int n)
{
int i,min=0;
for(i=0;i<n;i++)
if(p[i].y<p[min].y || (p[i].y == p[min].y && p[i].x < p[min].x))
min=i;
point temp=p[0];
p[0]=p[min];
p[min]=temp;
qsort(p+1,n-1,sizeof(point),cmp);
stack[0]=0;
stack[1]=1;
stack[2]=2;
top=2;
for(i=3;i<n;i++)
{
while(top>0 && mult(p[i],p[stack[top]],p[stack[top-1]])>=0)
top--;
stack[++top]=i;
}
}

/*int find_max()
{
int maxdis=0;
for(int i=0;i<=top;i++)
for(int j=i+1;j<=top;j++)
if(maxdis<dis(p[stack[i]],p[stack[j]]))
maxdis=dis(p[stack[i]],p[stack[j]]);
return maxdis;
}*/

int rotating_calipers()  //卡壳
{
int i , q=1;
int ans = 0;
for(i = 0 ; i < top ; i++)
{
while( mult( p[stack[i+1]] , p[stack[q+1]] , p[stack[i]] )  > mult( p[stack[i+1]] , p[stack[q]] , p[stack[i]] ) )
q = (q+1)%(top);
ans = max(ans , max( dis(p[stack[i]] , p[stack[q]]) , dis(p[stack[i+1]] , p[stack[q+1]])));
}
return ans;
}
int main()
{
int N;
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d %d",&p[i].x,&p[i].y);
graham(N);
printf("%d\n",rotating_calipers()/*find_max()*/);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: