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 |
Orz...使用模板,过题神速In Reply To:我承认,我抄的模板(吉林大学的) 最短距离枚举凸包的顶点 Posted by:hehexiaobai at 2010-08-29 20:53:49 > #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