洛谷P1268 樹的重量 貪心,數學

2021-09-16 21:30:51 字數 1070 閱讀 8161

題目:

分析:1、貪心:先處理點1、2構成的進化樹,再把點3加進,再把點4加進,直到所有點加進。

2、數學:已有點1、2、…、k構成的進化樹,要將點k+1加入,有以下加入法。加到點1、2的路徑中;加到點1、3的路徑中;…;加到點k-2、k-1的路徑中。假設加到點i、j的路徑中,則新增加的數值是(m[i][k+1]+m[j][k+1]-m[i][j])/2。這些新增加的數值中必有乙個最小值,從而把這個最小值加到已有的進化樹的重量中。需要說明的是,這些新增加的數值未必滿足構成新的進化樹。

記f[n]為點1、2、…、n構成的進化樹的重量,則

f[n]=f[n-1]+min,其中1<=i3、以四個點的具體例子說明:

m[1][2]=4:

兩個點時構成的進化樹是

再增加第三個點,m[1][3]=6,m[2][3]=8:

構成的進化樹是

再增加第四個點,m[1][4]=10,m[2][4]=12,m[3][4]=8:

嘗試三種構成:

點4分別加在點1、3的路徑上,點2、3的路徑上,點1、2的路徑上,對應的新增加的數值為6,6,9。其中第三種構成是不可能的。從而可以選擇前兩種構成。

ac**:

#include#includeusing namespace std;

int n,m[31][31];

float ans,len,tmp;

int main()

ans+=len;

} printf("%.0f\n",ans);

} return 0;

}

洛谷 P1268 樹的重量

題目描述 樹可以用來表示物種之間的進化關係。一棵 進化樹 是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的 進化樹 令n 用乙個n上的矩陣m來定義樹t。其中,矩陣m滿足 對於任意的i,j,k,有m i,j m j,...

洛谷 P1268 樹的重量()

構造法。鍛鍊思維的好題,需要運用一些樹的性質。以下用g i,j 表示點i與點j之間的距離。首先,我們考慮n 2時的情況,很顯然答案就是g 1,2 接下來考慮n 3時的情況。由於所有點均為葉子節點,很顯然點3是從點1到點2的路徑上分叉出來的,就像下圖。設藍色部分長度為len,那麼答案就是g 1,2 l...

洛谷P1268 樹的重量

因為所有的節點都是葉節點,因此每個葉節點都是從已有的節點中分出來的 而每個節點都可以從 1 j j i 中分出 當然類似於floyd三層迴圈列舉也可以 設i為要插入的節點 j為dis 1 j 中最小的那個 jfloyd的話是 for int i 3 i n i ans minn 其中i為要插入的節點...