【POJ1113】Wall-Graham-Scan算法求凸包
2017-02-18 12:28
351 查看
测试地址:Wall
题目大意:一个国王有n个城堡(可以看做平面上的点),现在要建一堵封闭的城墙将所有城堡围住,并且使得城墙与每座城堡的最短距离不超过L,求满足条件的最短城墙长度。
做法:可以证明,最短城墙长度等于这n个点的凸包周长加上一个半径为L的圆的周长,所以问题就转变为求这n个点的凸包,这里用基于极角排序的Graham-Scan算法来求凸包,时间复杂度为O(nlogn)。输出要注意,如果选C++就是%.0lf,如果选G++就是%.0f,否则会WA,我也不知道为什么......
以下是本人代码:
题目大意:一个国王有n个城堡(可以看做平面上的点),现在要建一堵封闭的城墙将所有城堡围住,并且使得城墙与每座城堡的最短距离不超过L,求满足条件的最短城墙长度。
做法:可以证明,最短城墙长度等于这n个点的凸包周长加上一个半径为L的圆的周长,所以问题就转变为求这n个点的凸包,这里用基于极角排序的Graham-Scan算法来求凸包,时间复杂度为O(nlogn)。输出要注意,如果选C++就是%.0lf,如果选G++就是%.0f,否则会WA,我也不知道为什么......
以下是本人代码:
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath> #define pi 3.14159265 #define e 0.00000001 using namespace std; int n,s[1010],top=1; double l,ans=0; struct point { double x,y; point operator - (point b) { point s; s.x=x-b.x; s.y=y-b.y; return s; } }p[1010]; double multi(point a,point b) { return a.x*b.y-b.x*a.y; } double dist(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } bool cmp(point a,point b) { if (a.x!=b.x) return a.x<b.x; return a.y<b.y; } bool cmp2(point a,point b) { double m=multi(a-p[1],b-p[1]); if (fabs(m)<=e) return dist(a,p[1])<dist(b,p[1]); return m>0; } void graham() { top=2,s[1]=1,s[2]=2; for(int i=3;i<=n;i++) { while(top>1&&multi(p[s[top]]-p[s[top-1]],p[i]-p[s[top]])<=0) top--; s[++top]=i; } } int main() { scanf("%d%lf",&n,&l); for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); sort(p+1,p+n+1,cmp); sort(p+2,p+n+1,cmp2); graham(); for(int i=1;i<top;i++) ans+=dist(p[s[i]],p[s[i+1]]); ans+=dist(p[1],p[s[top]]); ans+=pi*2*l; printf("%.0f",ans); return 0; }
相关文章推荐
- POJ 1113-Wall(凸包-Graham算法)
- Convex hull 之 Graham_scan(凸包检测算法)
- nyoj 226 wall (凸包 Graham算法)
- 凸包GiftWrapping GrahamScan 算法实现
- 凸包GiftWrapping GrahamScan 算法实现
- 凸包的几种算法 主要Graham-Scan算法的水平序法 另加poj113 wall的解题
- 计算几何之二维凸包:卷包裹算法、Graham Scan Algorithm、旋转卡壳算法
- Wall_poj1113_凸包
- POJ 1113 凸包2 Graham-scan 入门题(极角序,水平序)
- poj 1113 Wall 计算几何 凸包 Graham扫描
- 二维凸包模板 【Graham扫描算法】
- uva 10652 Board Wrapping(Graham凸包算法)
- 二维凸包 Graham 算法
- POJ 1113 Wall(Graham求凸包周长)
- poj 1113 Wall(Graham扫描法求凸包)
- [POJ1113]Wall(凸包)
- 寻找凸包 convex hull(二)——Graham_Scan
- Poj 1113 Wall (凸包Graham水平序)
- HDU 1348 Wall 标准凸包 Graham-Scan算法
- 二维凸包模板(Graham算法)