p1268 樹的重量

2022-04-30 08:21:11 字數 1666 閱讀 8310

傳送門

題目

樹可以用來表示物種之間的進化關係。一棵「進化樹」是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的「進化樹」。

令n=,用乙個n上的矩陣m來定義樹t。其中,矩陣m滿足:對於任意的i,j,k,有m[i,j] + m[j,k] >= m[i,k]。樹t滿足:

1.葉節點屬於集合n;

2.邊權均為非負整數;

3.dt(i,j)=m[i,j],其中dt(i,j)表示樹上i到j的最短路徑長度。

如下圖,矩陣m描述了一棵樹。

樹的重量是指樹上所有邊權之和。對於任意給出的合法矩陣m,它所能表示樹的重量是惟一確定的,不可能找到兩棵不同重量的樹,它們都符合矩陣m。你的任務就是,根據給出的矩陣m,計算m所表示樹的重量。下圖是上面給出的矩陣m所能表示的一棵樹,這棵樹的總重量為15。

輸入格式:

輸入資料報含若干組資料。每組資料的第一行是乙個整數n(2

輸入資料以n=0結尾。

輸出格式:

對於每組輸入,輸出一行,乙個整數,表示樹的重量。

分析

我們先考慮n=2的情況,此時答案即為1與2之間的距離。

我們再考慮n=3的情況,如圖

我們設兩點間距離為t,則插入第3個點所增加的重量即為t23+t13-t12

我們再考慮n=4的情況,如圖

我們不難發現因為4與12和3到12有重邊,所以我們不能在用12兩點的資訊來更新4,但我們可以用13或23來更新。所以我們得出乙個結論,在增加第i個點所增加的重量是小於i的任意兩點所求得的新重量的最小值,即δans=min。因為n的範圍很小,所有我們用三重迴圈求解即可。

**

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int g[1100][1100

];int

main()

int ans=g[1][2

],sum;

for(i=3;i<=n;i++)

printf(

"%d\n

",ans);

scanf("%d

",&n);

}return0;

}

p1268樹的重量 題解

題面描述點此qwq。正解開始。一道茅塞頓開恍然大悟的題目 第一眼看到這個題的時候,語文不好的我對著題目中的 這些,和 這句話發呆半天,因為不關我怎麼構建幾何模型,我都不理解這句話。吐槽題面臃腫!然後想了一下,發現題目是這個亞子 給你乙個矩陣m,m上每乙個節點 i,j 表示葉子結點i和葉子結點j的距離...

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