樹的重量 洛谷1268 遞推

2021-07-26 12:13:21 字數 1901 閱讀 7052

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

令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

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

對於這種題目我是毫無想法

看題解然後自己想了下,大概意思是對於每個點i都能從1~j的分支中延伸出來,用類似lca求路徑的方法能搞出新增距離,找最小值 (d

[1][

i]+d

[i][

j]−d

[1][

j])/

2 還不是很懂:-d

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define debug puts("-----")

#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)

#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)

#define fill(x, t) memset(x, t, sizeof(x))

#define min(x, y) x#define max(x, y) x>y?x:y

#define pi (acos(-1.0))

#define eps (1e-8)

#define inf (1<<30)

#define ll long long

#define db double

#define ld long double

#define n 61

#define e n * 8 + 1

#define mod 100000007

#define l 255

using

namespace

std;

int matrix[n][n];

inline

int read()

ch = getchar();

}while (ch <= '9' && ch >= '0')

return x * v;

}int main(void)

}int ans = matrix[1][2];

rep(i, 3, n)

ans += now;

}printf("%d\n", ans);

}return

0;}

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