给出zoj1626的c++AC代码
时间: 2023-08-24 16:15:53 浏览: 172
zoj1951的AC代码
以下是ZOJ1626的C++ AC代码,使用了旋转卡壳算法:
```c++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define MAXN 100010
#define eps 1e-8
#define INF 1e20
using namespace std;
struct point
{
double x,y;
friend point operator -(point a,point b)
{
point res;
res.x=a.x-b.x;
res.y=a.y-b.y;
return res;
}
friend bool operator <(point a,point b)
{
if(fabs(a.x-b.x)<eps)
return a.y<b.y;
return a.x<b.x;
}
friend double operator *(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
friend double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
}a[MAXN],b[MAXN],st[MAXN];
int n;
double ans=INF;
int cmp(point a,point b)
{
double tmp=(a-b)*(a[1]-b);
if(fabs(tmp)<eps)
return dis(a,a[1])-dis(b,a[1])<0;
return tmp>0;
}
int main()
{
while(~scanf("%d",&n) && n)
{
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
sort(a+1,a+n+1);
int tot=0;
for(int i=1;i<=n;i++)
{
while(tot>=2 && (st[tot]-st[tot-1])*(a[i]-st[tot])<0)
tot--;
st[++tot]=a[i];
}
int k=tot;
for(int i=n-1;i>=1;i--)
{
while(tot>k && (st[tot]-st[tot-1])*(a[i]-st[tot])<0)
tot--;
st[++tot]=a[i];
}
tot--;
for(int i=1;i<=tot;i++)
b[i]=st[i];
int tmp=1;
for(int i=2;i<=tot;i++)
if(b[i].y<b[tmp].y)
tmp=i;
swap(b[1],b[tmp]);
sort(b+2,b+tot+1,cmp);
st[1]=b[1];
st[2]=b[2];
k=2;
for(int i=3;i<=tot;i++)
{
while(k>1 && (st[k]-st[k-1])*(b[i]-st[k])<=0)
k--;
st[++k]=b[i];
}
double ans=0;
if(k==2)
ans=dis(st[1],st[2]);
else
{
st[k+1]=st[1];
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
ans=max(ans,dis(st[i],st[j]));
}
printf("%.2lf\n",ans/2);
}
return 0;
}
```
其中,结构体 `point` 表示二维平面上的一个点,包含了点的坐标和一些基本操作。函数 `cmp` 是旋转卡壳算法中的比较函数,按照点到起点的极角从小到大排序。在主函数中,先使用 Graham 扫描法求出点集的凸包,然后按照旋转卡壳的步骤,求出凸包上的最远点对距离作为最小直径。
阅读全文