【凸包 Graham法 點集排序】poj 1113 Wall
Link:http://poj.org/problem?id=1113
Graham法求凸包(O(Nlog2N))
將點排序,先按從下到上,y座標相等再按從左到右,排序後,正著遍歷一遍找到最低點到最高點滿足(即右邊部分的凸包),
反著遍歷一遍找到最高點到最低點滿足(即左邊部分的凸包)
注意:算個數的時候,演算法對於最低點和最高點都算了兩次,同時要考慮是否要共線。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
/*
poj 1113
題意:要求建一堵圍牆圍繞城堡,牆於城堡的距離不小於L,輸入城堡每個節點的座標,求圍牆的最小長度。
題解:凸包加上360°的弧長。
*/
const int N = 1010;
const double PI = acos(-1.0);
struct Point
{
double x,y;
};
bool cmp(Point aa,Point bb)
{
if(aa.y != bb.y) return aa.y < bb.y;
return aa.x < bb.x;
}
//是否嚴格左轉,共線不算(叉乘)
double xmult(Point a,Point b,Point c) //(ca)×(cb)
{
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
Point a[N];
int n,cnt,tail;
int tmp[N],ans[N];
void Jarvis()
{
sort(a,a+n,cmp);
cnt = tail = 0;
tmp[tail++] = 0;
tmp[tail++] = 1;
for(int i = 2; i < n; i++)
{
while(tail>1 && xmult(a[tmp[tail-1]],a[i],a[tmp[tail-2]])<=0)
tail--;
tmp[tail++] = i;
}
for(int i = 0; i < tail; i++) ans[cnt++] = tmp[i];
tail = 0;
tmp[tail++] = n-1;
tmp[tail++] = n-2;
for(int i = n-3; i >= 0; i--)
{
while(tail>1 && xmult(a[tmp[tail-1]],a[i],a[tmp[tail-2]])<=0)
tail--;
tmp[tail++] = i;
}
for(int i = 0; i < tail; i++) ans[cnt++] = tmp[i];
}
double dist(Point p1,Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
}
int main()
{
double L;
while(~scanf("%d%lf",&n,&L))
{
for(int i = 0; i < n; i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
Jarvis();
double res = 2*PI*L;
for(int i = 0; i < cnt-1; i++)
res += dist(a[ans[i]],a[ans[i+1]]);
printf("%.0f\n",res);
}
return 0;
}
相關文章
- POJ 1113-Wall(凸包-Graham演算法)演算法
- 【凸包 Graham法 極角排序】poj 2007 Scrambled Polygon排序Go
- POJ 1113 Wall(思維 計算幾何 數學)
- POJ 1584-A Round Peg in a Ground Hole(計算幾何-凸包、點到線段距離)
- 為什麼凸問題的解集是凸集
- 「管理數學基礎」3.1 凸分析:凸集與凸集分離定理、Farkas引理
- HDU 4946 Area of Mushroom(凸包)OOM
- 求多邊形凸包(線性演算法)--陳氏凸包演算法--演算法
- 凸集、凸函式定義及主要性質函式
- POJ-2299 Ultra-QuickSort-分治法排序求交換速度UI排序
- Convex Set and Convex Function凸集與凸函式Function函式
- HDU 3685 Rotational Painting(凸包+重心)AI
- poj 1094 拓撲排序排序
- 【計算幾何】多邊形點集排序排序
- poj1094 拓撲排序排序
- 【思考點亮生命之光】AWR之父Graham Wood專訪
- SGU 277 Heroes(動態凸包維護)
- POJ 1182(食物鏈-另類做法【拆點】)[Template:並查集]並查集
- 大資料集報表點選表頭排序大資料排序
- POJ 3249-Test for Job(拓撲排序&&DP)排序
- 斜率優化(凸包優化)DP問題acm優化ACM
- HDU 4667 Building Fence(求凸包的周長)UI
- 排序:交換排序——氣泡排序法排序
- POJ2492(種類並查集)並查集
- 快速排序法排序
- 交換排序法排序
- shell排序法排序
- multicast導致節點無法加入叢集AST
- POJ 1308-Is It A Tree?(並查集)並查集
- 【POJ 1182】食物鏈(並查集)並查集
- POJ1094[有向環 拓撲排序]排序
- 計算幾何(一):凸包問題(Convex Hull)
- [USACO5.1] 圈奶牛Fencing the Cows /【模板】二維凸包
- 機器學習中牛頓法凸最佳化的通俗解釋機器學習
- (四)桶排序法排序
- 排序法(轉載)排序
- 氣泡排序法排序
- 選擇排序法排序