poj 2079 Triangle,旋轉卡殼求點集的最大三角形

來源:互聯網
上載者:User

標籤:style   os   for   ar   amp   size   on   sp   

給出一個點集,求頂點在點集中的最大的三角形面積。


我們知道這三角形的三個點肯定在凸包上,我們求出凸包之後不能枚舉,因為題目n比較大,枚舉的話要O(n^3)的數量級,所以採用旋轉卡殼的做法:
首先枚舉三角形的第一個頂點i, 初始化第二個頂點j=i+1和第三個頂點k=j+1,對k進行迴圈,直到找到第一個k使得cross(i,j,k)>cross(i,j,k+1),如果k==i進入下一次迴圈。
對j,k進行旋轉,每次迴圈之前更新最大值,然後固定一個j,同樣找到一個k使得cross(i,j,k)>cross(i,j,k+1)。對j進行++操作,繼續進行下一次,知道j==k‘(對j,k旋轉之前的(k+1)%n)或k==i為止。


double rotating_calipers(vector<Point>& points){    vector<Point> p = ConvexHull(points);    int n = p.size();    p.push_back(p[0]);    double ans = 0;    for(int i=0; i<n; ++i)    {        int j = (i+1)%n;        int k = (j+1)%n;        //當Area(P[i], p[j], p[k+1]) <= Area(p[i], p[j], p[k]) 時停止旋轉        //即Cross(p[j]-p[i], p[k+1]-p[i]) - Cross(p[j]-p[i], p[k]-p[i]) <= 0        //根據Cross(A,B) - Cross(A,C) = Cross(A,B-C)        //化簡得Cross(p[j]-p[i], p[k+1] - p[k]) <= 0        while(k!=i && Cross(p[j]-p[i], p[k+1]-p[k]) > 0)            k = (k+1) % n;        if(k==i) continue;        int kk = (k+1) % n;        while(j!=kk && k!=i)        {            ans = max(ans, Cross(p[j]-p[i], p[k]-p[i]));            while(k!=i && Cross(p[j]-p[i], p[k+1]-p[k]) > 0)                k = (k+1) % n;            j = (j+1) % n;        }    }    return ans*0.5;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.