樹可以用來表示物種之間的進化關係。一棵「進化樹」是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的「進化樹」。
令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
輸出格式:
對於每組輸入,輸出一行,乙個整數,表示樹的重量。
輸入樣例#1:
5輸出樣例#1:5 9 12 8
8 11 7
5 14
415 36 60
31 55360
15【思路】這是一棵樹,只有葉節點有值,將葉節點合併,合併後樹的重量不變,最後成為兩個點的樹。合併的前提是兩個葉節點是由同乙個父親連線來的。因此他們與樹上任意點相連總會經過父親,且到任意一點的距離差是個定值也就是他們到父親節點的距離差。根據這一點可以判斷兩點能否合併。最後剩下兩點的距離就是樹的重量。71
【**】
#include #include #include #include #include using namespace std;
const int maxn=33;
int n,a[maxn][maxn],del;
bool vst[maxn];
inline int get()
inline bool ck(int x,int y)
return 1;
}inline void work(int x,int y)
inline void sl()
}int main(){
while(1){
n=get();
if(n==0)break;
memset(vst,0,sizeof(vst));
for(int i=1;i
樹的重量 洛谷1268 遞推
樹可以用來表示物種之間的進化關係。一棵 進化樹 是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的 進化樹 令n 用乙個n上的矩陣m來定義樹t。其中,矩陣m滿足 對於任意的i,j,k,有m i,j m j,k m i...
洛谷 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...