1. 程式人生 > >二維最小乘積生成樹學習小記

二維最小乘積生成樹學習小記

轉化 div 求解 idt pla 學習 right log inf

Preface

  對於形如給定一些邊,其邊權為xi和yi,構造一個生成樹,使得

技術分享圖片

  我們稱這棵樹,為最小乘積生成樹。我們可以考慮,沿用最小生成樹的思想,把這種新穎的最小生成樹做對。

Content

算法簡介


  其實就是利用樹形結合的思想,將點弄到平面直角坐標系上,使之明了,轉化問題,求出最優解。

算法應用

  應對類似的裸題,直接裸奔

算法核心

  我們將sigma(xi)看成橫坐標,sigma(yi)看成縱坐標,在坐標系中繪制出來。並在x,y軸作垂線,構成一個正方形

  我們要求一種方案xy=k最小,也就是這個正方形最小,也就是反比例函數(等面積線)y=k/x最接近坐標軸(k最小,即y最小)

技術分享圖片

  顯然可以知道,把所有點列出來,構建一個下凸殼,最優的點(x,y)必定在下凸殼上。

  如下圖,如果一個點不在凸包上,那麽以這個點作矩陣,顯然面積比以被圈圈起來的點作矩陣優,這更顯然吧?

技術分享圖片

  網上大都用分治求解

  固定凸包上最接近x軸與y軸的兩個節點,即求離x軸,y軸最近的點(分別以x,y為關鍵字作最小生成樹即可,所得x,y必定最小)。

  尋找一個點C,使得C離AB最遠,也就是△ABC面積最大,想要用C來更新答案。這個點C是目前最優的。

  如何找點C?我們用向量來考慮。可能覺得比較奇妙,說不出個之所以然,但是過程嚴謹,是沒有錯的,多悟一下,睡前想一想,第二天就懂了。

  向量AB=(B.x-A.x,B.y-A.y)

  向量AC=(C.x-A.x,C.y-A.y)

  根據向量定義,得出S△ABC=AB

二維最小乘積生成樹學習小記