POJ 1873 & 1228 凸包和穩定凸包

凸包指的是這麼一件事:平面上有好多點,你希望用一些點圍成一個儘量小的凸多邊形,然後把所有的點都框住。求凸包是很有用的,往往會作爲解計算幾何題目的第一步。


求凸包一般用Graham算法,它是NlgN的算法,非常簡單。基本步驟就是先極角排序,然後從第一個點開始,每次向下一個點連一條向量,如果這條向量和之前已經加入凸包的點的點之間出現凹進去的部分了,就把之前的點踢掉。由於每個點只進出凸包一次,所以掃描複雜度是N,這樣就是NlgN的複雜度。


如果三點共線的話,凸包應該只包含兩側的點。


求凸包時有這麼幾點需要注意:


第一,模板中的list數組每次求凸包之後都會把點排序,因此像POJ 1873這種需要帶上搜索的,就不能直接在list數組裏搞,會亂掉的。

第二,list數組中不能有兩個重複的點,否則這兩個構成0向量,怎麼弄也弄不掉。

第三,當點數小於3的時候需要小心,不過這個模板裏已經處理了這種情況了。


POJ 1228實際上是個“穩定凸包問題”,穩定凸包說的是,如果在一個凸包外面再加一點,能否構成面積更大的凸包,如果能,則之前的凸包就是不穩定的。凸包穩定的充要條件是凸包的每一條邊上都有3個或以上的點,這很容易想,如果只有兩個點的話,就像拉皮筋一樣,往外一拉就是一個更大的凸包了。如果有3個點的話,往外一拉,就會有凹的地方出現,就不是凸包了。


POJ 1228由於給你的點本身已經是一個有多餘點的凸包了,所以我的做法是:將所有點逆時針排序,然後檢查是否有兩個連續的拐角就可以了。檢查兩個連續的拐角,只需要檢查是否有兩個連續的點,每個點相鄰的兩條向量夾角不爲0就可以了。


但是WA得我不能理解,後來規定排序的時候先找到最左下角的點,然後排序,就對了……


而且不知道有沒有NlgN做逆時針排序的算法? 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章