這個東西代碼我是對着Trinkle的寫的,所以就不放代碼了..
Delaunay剖分的定義: 一個三角剖分是Delaunay的當且僅當其中的每個三角形的外接圓內部(不包括邊界)都沒有點.
它的存在性是調整法可證的.
最小生成樹的性質: 對於每個環c,它上面最長的邊一定有一條不在MST上.
Delaunay剖分的性質: 如果有一條邊的兩個端點在一個內部(包括邊界)沒有其他點的圓上,那么這條邊一定在Delaunay剖分內(反證).
那么如果有一條邊u,v不在一個Delaunay剖分上,那么在任何一個u,v的外接圓內一定存在一個點c.我們考慮u,v為直徑的那個圓,顯然u--v,v--c,c--u成為一個環且u--v是最長邊,那么u--v就可以被消去,從而不在MST上.
那么思路就比較明確了,我們先求出Delaunay剖分,再對Delaunay剖分上的邊做MST. Delaunay剖分是一個平面圖所以邊數是與點數成線性關系的.
我們做Delaunay剖分的方法是: 對點按照x先的順序排序,然后分治的做.那么我們現在需要考慮的就是合並兩個不相交的Delaunay剖分.
我們可以先找到最低的邊,以此為基准每次添加一個沒有點在內部的三角形將這兩個剖分連接.具體做法可以看這個 http://www.geom.uiuc.edu/~samuelp/del_project.html ,還是相當生動形象的.
復雜度的話,暴力就是O(n)一次的,因為每條遍歷過的邊要么不再碰了要么就刪去了,然后也只會加O(n)條邊.
所以保持總復雜度O(nlogn)是相對輕易的事情(雖然一點也不好寫).