凸包-Graham Scan算法

计算几何超经典算法,o(n),可用来求凸包周长,直径,面积等。

作文以记之。

//此题为求凸包直径 #include <iostream> #include <algorithm> #include <cmath> using namespace std; struct point { int x,y; }p[50010],q[50010]; int multi(point p1,point p2,point p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } int dis(point p1,point p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } bool cmp(point a,point b) { if (multi(a,b,p[1])>0 || (multi(a,b,p[1])==0 && dis(a,p[1])<dis(b,p[1]))) return true; return false; } int main() { int n,i,j,top; int ans; cin >> n; for (i=1;i<=n;i++) { cin >> p[i].x >> p[i].y; if (p[i].y<p[1].y || (p[i].y==p[1].y && p[i].x<p[1].x)) swap(p[1],p[i]); } sort(p+2,p+n+1,cmp); top=0; q[++top]=p[1]; q[++top]=p[2]; for (i=3;i<=n;i++) { while (top>1 && multi(q[top],p[i],q[top-1])<0) top--; q[++top]=p[i]; } ans=0; for (i=1;i<top;i++) for (j=i+1;j<=top;j++) ans=max(ans,dis(q[i],q[j])); cout << ans << endl; //system("pause"); return 0; }

你可能感兴趣的:(算法)