傳送門
題目
樹可以用來表示物種之間的進化關係。一棵「進化樹」是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的「進化樹」。
令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...