USACO5.1凸包参考代码

来源:互联网 发布:知乎 宋慈 编辑:程序博客网 时间:2024/05/01 13:56
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int maxn=10000+5;struct node{double x,y;}a[maxn];int stack[maxn],top;bool cmp(node p,node q){return p.x<q.x;}double dist(int u,int v){return sqrt((a[u].x-a[v].x)*(a[u].x-a[v].x)+(a[u].y-a[v].y)*(a[u].y-a[v].y));}bool pd(int u,int v,int w){return (a[u].y-a[v].y)*(a[v].x-a[w].x)>(a[v].y-a[w].y)*(a[u].x-a[v].x);}int main(){int i,j,k,m,n;cin>>n;for(i=1;i<=n;i++)cin>>a[i].x>>a[i].y;sort(a+1,a+n+1,cmp);top=2;stack[1]=1;stack[2]=2;for(i=3;i<=n;i++){while(top>1 && !pd(i,stack[top],stack[top-1]))top--;stack[++top]=i;}double ans=0;for(i=1;i<top;i++)ans+=dist(stack[i],stack[i+1]);top=2;stack[1]=1;stack[2]=2;for(i=3;i<=n;i++){while(top>1 && pd(i,stack[top],stack[top-1]))top--;stack[++top]=i;}for(i=1;i<top;i++)ans+=dist(stack[i],stack[i+1]);printf("%.2lf\n",ans);return 0;}

3 0
原创粉丝点击