J 護城河 凸包 計算幾何

2021-10-18 19:38:02 字數 3215 閱讀 1560

​ 凸包求周長裸題

​ 複習一波凸包。

首先凸包有兩種方法:

1.graham

2.andrew

主流是graham掃瞄法。

graham的流程:

1.找到最左下角的點,該點一定在凸包上。

2.極角排序。

3.利用凸包棧維護。

**部分:

/找到左下角的點

int id=1;

for(

int i=

2;i<=n;i++)if

(a[i]

.x.x||

(a[i]

.x==a[id]

.x&&a[i]

.y.y)) id=i;

swap

(a[1

],a[id]);

sort

(a+2

,a+n+

1,cmp)

;double

graham()

double ans=0;

for(

int i=

2;i<=top;i++

) ans+

=sqrt

(dis

(s[i]

,s[i-1]

));if

(top>

1) ans+

=sqrt

(dis

(s[top]

,s[1])

);return ans;

}

andrew演算法的流程

1.排序按照x為第一關鍵字,y為第二關鍵字排序。

2.從左往右掃求出凸包下部分。

3.從右往左掃求出凸包上部分。

**部分

sort

(a+1

,a+n+1)

;double

andrew()

int tmp=top;

//這裡要從n-1開始因為n已經被丟進去.

for(

int i=n-

1;i;)if

(n>

1) top--

;//因為多了乙個1號結點 要去掉

double ans=0;

for(

int i=

2;i<=top;i++

) ans+

=sqrt

(dis

(s[i]

,s[i-1]

));if

(top>

1) ans+

=sqrt

(dis

(s[1

],s[top]))

;return ans;

}

#include

using

namespace std;

typedef

long

long ll;

const

int n=

5e3+

5,m=

2e4+

5,inf=

0x3f3f3f3f

,mod=

1e9+7;

#define mst(a,b) memset(a,b,sizeof a)

#define pii pair

#define fi first

#define se second

#define pb push_back

struct pa[n]

,s[n]

;int top,n;

double

cross

(p a,p b,p c)

double

dis(p a,p b)

bool

cmp(p u,p v)

double

graham()

double ans=0;

for(

int i=

2;i<=top;i++

) ans+

=sqrt

(dis

(s[i]

,s[i-1]

));if

(top>

1) ans+

=sqrt

(dis

(s[top]

,s[1])

);return ans;

}int

main()

#include

using

namespace std;

typedef

long

long ll;

const

int n=

5e3+

5,m=

2e4+

5,inf=

0x3f3f3f3f

,mod=

1e9+7;

#define mst(a,b) memset(a,b,sizeof a)

#define pii pair

#define fi first

#define se second

#define pb push_back

struct p

}a[n]

,s[n]

;int top,n;

double

cross

(p a,p b,p c)

double

dis(p a,p b)

double

andrew()

int tmp=top;

for(

int i=n-

1;i;)if

(n>

1) top--

;//因為多了乙個1號結點 要去掉

double ans=0;

for(

int i=

2;i<=top;i++

) ans+

=sqrt

(dis

(s[i]

,s[i-1]

));if

(top>

1) ans+

=sqrt

(dis

(s[1

],s[top]))

;return ans;

}int

main()

計算幾何 凸包

有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...

計算幾何 凸包

如求凸包周長 include include include include include include using namespace std define pi 3.1415926 define eps 1e 10 class point 建立point類,裡面包含很多point的運算子 定...

計算幾何 凸包

凸多邊形 任意兩個頂點的連線都在多邊形內部,這樣的多邊形稱為凸多邊形 凸包的定義 乙個凸多邊形的頂點的集合 求凸包的一般形式 給出乙個點集,求出覆蓋所有點的最小凸多邊形 graham演算法 時間複雜度 o nlogn 極角排序耗時 先取出乙個端點,必須為凸包上的乙個點,取最下且最右的點即可 以端點進...