凸包Graham掃瞄法 HDU3847

2021-07-22 05:41:28 字數 2091 閱讀 1256

凸包定義:

點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。

凸包最常用的凸包演算法是graham掃瞄法和jarvis步進法。

graham掃瞄法:

首先,找到所有點中最左邊的(y座標最小的),如果y座標相同,找x座標最小的.

以這個點為基準求所有點的極角(atan2(y-y0,x-x0)),並按照極角對這些點排序,前述基準點在最前面,設這些點為p[0]..p[n-1].

ps:這樣預處理後,保證p[0],p[1]和p[n-1]都是凸包上的點.

建立乙個棧,初始時p[0]、p[1]、p[2]進棧,對於 p[3..n-1]的每個點,若棧頂的兩個點與它不構成」向左轉」的關係,則將棧頂的點出棧,直至沒有點需要出棧以後將當前點進棧;

所有點處理完之後棧中儲存的點就是凸包了。

圖示:

題意:

求能讓乙個給出的圖形通過縫隙的最小寬度。

題解:

用這些點構造乙個凸包,列舉凸包的各個邊,求凸包上其他點到這個邊的距離的最大值中的最小值。

**:

#include 

#include

#include

#include

#include

using

namespace

std ;

#define max 110

const

double eps = 1e-8 ;

int sgn(double x)

struct point

point(double _x , double _y)

point operator - (const point &b) const

double

operator ^ (const point &b) const

double

operator * (const point &b) const

};struct line

line(point _s , point _e)

};double xmult(point p0,point p1,point p2) //叉積p0p1 x p0p2

double dist(point a ,point b)

double pointtoline(point p ,line l)

point list[max] ;

int stack[max] , top ;

bool _cmp(point p1,point p2)

void anglesort(int n) //輸入,並把最左下方的點放在list[0],並且進行極角排序

}list[k]=list[0];

list[0]=p0;

sort(list+1,list+n,_cmp);

}void graham(int n)

}swap(list[k],list[0]);

sort(list+1,list+n,_cmp);

if(n == 1)

if(n == 2)

stack[0] = 0;

stack[1] = 1;

top = 2;

for(int i = 2;i < n;i++)

//for(int i = 0 ; i < top ; i ++) printf("%d\n" , stack[i]);

}double solve()

ans = min(ans , temp) ;

for(int i = 0 ; i < top - 1 ; i ++)

ans = min(ans , temp) ;

}return ans ;

}int main()

return

0 ;}

凸包(Graham掃瞄法構建)

ps 我的媽呀,心態 好像也不太難,看各種模板看的雲裡霧裡的,真的還是自己動手敲來的好,幾乎沒多久就懂的差不多了。乙個本該寒假就該掌握的知識,居然熬了我幾個小時。這一次還是很好的了解了凸包,以前看群裡學長們說,覺得好高大上,好難的樣子,仔細了解後發現其實也沒有想象中的那麼恐怖 凸包基本概念 這就是乙...

凸包問題 Graham掃瞄法

凸包點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。右圖中由紅色線段表示的多邊形就是點集q 的凸包。頂點個數n 1 排序 在點集q中找最左下方的點p0,就是x座標和y座標都最小的點,其餘的點計算它們的極座標幅角,以幅角的非降序順序來排序,如果有幅角...

尋找凸包的graham 掃瞄法

1,點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。2,凸包最常用的凸包演算法是graham掃瞄法和jarvis步進法。3,graham掃瞄法 首先,找到所有點中最左邊的 y座標最小的 如果y座標相同,找x座標最小的.以這個點為基準求所有點的極角 ...