p1268樹的重量 題解

2022-01-12 08:20:50 字數 1387 閱讀 6221

題面描述點此qwq。

正解開始。

一道茅塞頓開恍然大悟的題目:

第一眼看到這個題的時候,語文不好的我對著題目中的

這些,和:

這句話發呆半天,,,,

因為不關我怎麼構建幾何模型,我都不理解這句話。。

(吐槽題面臃腫!)

然後想了一下,發現題目是這個亞子:

給你乙個矩陣m,m上每乙個節點(i,j)表示葉子結點i和葉子結點j的距離,每個矩陣有且只能生成唯一乙個樹(不然這題沒法搞了),讓你求這棵樹上的每一條邊的權值和。

在李姐(lz dalao)完題目之後,我又開始懵了。。。。。。到底怎麼搞非葉節點的位置???暴力恐怕不行的。。

百思不得其解後,我在絕望中從最簡單情況遞推:

考慮只有兩個(n=2)節點1,2,一條邊權值為3

這種情況:

那麼,兩個節點自然權值就為3了,答案也是3。

一旦跨越到n=3這種情況,就有些棘手。

因為3個節點都是葉子結點,那麼必然要在1到2的路徑上選乙個中間節點來連線3號節點。

(選**好呢..?)

因為1到3和2到3的長度都知道了,那麼我們可以利用數學方法求助3的位置。

假設m[1][3]=4,m[2][3]=3,那麼這兩條路徑必然有和1到2的路徑重複的

那麼我們減去重複的,就是3節點到1,2路徑的距離了。

如圖:

公式:(jz[1][3]+jz[2][3]-jz[1][2])/2=(4+3-3)/2=2.

那麼,理解了這個以後,我們可以順著推n>3的情況:

從之前n-1的情況中找兩個點之間的路徑,並嘗試插入當前節點,然後取min。

節點太多就不畫了。。

上**吧。。

#include#include

#include

using

namespace

std;

inline

intread()

int n,jz[100][100

];int

main()

ans+=dt;

}printf(

"%d\n

",ans);

n=read();}}

完結。

p1268 樹的重量

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

洛谷 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...