Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我承认,我抄的模板(吉林大学的) 最短距离枚举凸包的顶点In Reply To:Help!! get wa, why??? Posted by:smwwh at 2010-08-28 11:30:07 #include<iostream> #include<cmath> #include<algorithm> using namespace std; const int MAX=50005; struct point { double x,y; }; point points[MAX],res[MAX]; bool mult(const point sp,const point ep,const point op) { return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y); } bool operator < (const point &l, const point r) { return l.y<r.y||(l.y==r.y&&l.x<r.x); } double dis(point a, point b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } int graham(point pnt[], int n, point res[]) { int i,len,k=0,top=1; sort(pnt, pnt+n ); if(n==0)return 0; res[0]=pnt[0]; if(n==1)return 1; res[1]=pnt[1]; if(n==2)return 2; res[2]=pnt[2]; for(i=2; i<n; i++) { while(top&&mult(pnt[i],res[top],res[top-1])) top--; res[++top]=pnt[i]; } len=top; res[++top]=pnt[n-2]; for(i=n-3; i>=0; i--) { while(top!=len&&mult(pnt[i],res[top],res[top-1])) top--; res[++top]=pnt[i]; } return top; } int main() { int n; cin>>n; for(int i=0; i<n; i++) cin>>points[i].x>>points[i].y; int top=graham(points, n, res); double ans=0; for(int i=0; i<top; i++) for(int j=i+1; j<top; j++) if(dis(res[i],res[j])>ans)ans=dis(res[i],res[j]); cout<<int(ans+0.0005)<<endl; system("pause"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator