題意:給定二維平面上不超過50000個點,求最遠點對距離的平方。
思路:由資料量來判斷直接列舉會超時。注意到最遠距離點對必出現在這些點的凸包上,所以可以先求出凸包,然後在凸包上列舉。此法的最壞情況複雜度仍然是n^2的,但是可以ac這道題了。在複雜度意義下的優化是旋轉卡殼(參考
如果qa,qb是凸包上最遠兩點,必然可以分別過qa,qb畫出一對平行線。通過旋轉這對平行線,我們可以讓它和凸包上的一條邊重合,如圖中藍色直線,可以注意到,qa是凸包上離p和qb所在直線最遠的點。於是我們的思路就是列舉凸包上的所有邊,對每一條邊找出凸包上離該邊最遠的頂點,計算這個頂點到該邊兩個端點的距離,並記錄最大的值。直觀上這是乙個o(n2)的演算法,和直接列舉任意兩個頂點一樣了。但是注意到當我們逆時針列舉邊的時候,最遠點的變化也是逆時針的,這樣就可以不用從頭計算最遠點,而可以緊接著上一次的最遠點繼續計算(詳細的證明可以參見上面鏈結中的**)。於是我們得到了o(n)的演算法。
凸包上列舉:
#include #include #include #include #include #include using namespace std;
#define clc(s,t) memset(s,t,sizeof(s))
#define inf 0x3fffffff
#define n 50005
struct pointp[n];
int n;
int stack[n],top = -1;
int multi(struct point a,struct point b,struct point c)
int dis(struct point a,struct point b)
int cmp(struct point a,struct point b)
int main()else if(p[i].y==begin.y && p[i].x0 && multi(p[stack[top-1]], p[stack[top]], p[i])<=0)
top--;
stack[++top] = i;
}for(i = 0;i旋轉卡殼:
#include #include #include #include #include #include using namespace std;
#define clc(s,t) memset(s,t,sizeof(s))
#define inf 0x3fffffff
#define n 50005
struct pointp[n];
int n;
int stack[n],top = -1;
int multi(struct point a,struct point b,struct point c)
int dis(struct point a,struct point b)
int cmp(struct point a,struct point b)
int main()else if(p[i].y==begin.y && p[i].x0 && multi(p[stack[top-1]], p[stack[top]], p[i])<=0)
top--;
stack[++top] = i;
}//至此用graham法求得凸包,下面是旋轉卡殼法
j = 1;
stack[++top] = 1;
for(i = 0;imulti(p[stack[i]], p[stack[i+1]], p[stack[j]]))
j = (j+1)%top;//逆時針列舉距離線段(p[stack[i]],p[stack[i+1]])最遠的點j
res = max(res,dis(p[stack[i]],p[stack[j]]));
}printf("%d\n",res);
}
poj 2187(旋轉卡殼)
傳送門 模板題,求凸包,用旋轉卡殼求出最遠點對。因為把int弄成double,wa了好幾次,差點對idy大神給的模板失去信心。不過事實證明idy的寫法沒問題,orz!include include include include include include using namespace std...
POJ2187 旋轉卡殼求平面最遠點對
分類 計算幾何 2013 02 12 15 23 62人閱讀收藏 舉報旋轉卡殼可以用於求凸包的直徑 寬度,兩個不相交凸包間的最大距離和最小距離等。深度學習旋轉卡殼這裡 題目 beauty contest cpp view plain copy include include include usin...
旋轉卡殼入門 模板題(POJ 2187)
最初接觸旋轉卡殼 應該讀xu n zhu n qi k 是在csu上的一道題 這道題至今沒a,也不知道是是嗎玄學操作,更新 ac了,輸出記得用 f 不過這不重要,重要是學到了新知識!1978年,m.i.shamos s ph.d.的 computational geometry 標誌著電腦科學的這一...