樹形DP codevs 1814 最長鏈

2022-09-17 05:30:14 字數 1380 閱讀 2180

時間限制: 1 s

空間限制: 256000 kb

題目等級 : 鑽石 diamond

現給出一棵n個結點二叉樹,問這棵二叉樹中最長鏈的長度為多少,保證了1號結點為二叉樹的根。

輸入描述 input description

輸入的第1行為包含了乙個正整數n,為這棵二叉樹的結點數,結點標號由1至n。

接下來n行,這n行中的第i行包含兩個正整數l[i], r[i],表示了結點i的左兒子與右兒子編號。如果l[i]為0,表示結點i沒有左兒子,同樣地,如果r[i]為0則表示沒有右兒子。

輸出描述 output description

輸出包括1個正整數,為這棵二叉樹的最長鏈長度。

樣例輸入 sample input

2 34 5

0 60 0

0 0樣例輸出 sample output

資料範圍及提示 data size & hint

【樣例說明】

4-2-1-3-6為這棵二叉樹中的一條最長鏈。

【資料規模】

對於10%的資料,有n≤10;

對於40%的資料,有n≤100;

對於50%的資料,有n≤1000;

對於60%的資料,有n≤10000;

對於100%的資料,有n≤100000,且保證了樹的深度不超過32768。

【提示】

關於二叉樹:

二叉樹的遞迴定義:二叉樹要麼為空,要麼由根結點,左子樹,右子樹組成。左子樹和右子樹分別是一棵二叉樹。

請注意,有根樹和二叉樹的三個主要差別:

1. 樹的結點個數至少為1,而二叉樹的結點個數可以為0;

2. 樹中結點的最大度數沒有限制,而二叉樹結點的最大度數為2;

3. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。

關於最長鏈:

最長鏈為這棵二叉樹中一條最長的簡單路徑,即不經過重複結點的一條路徑。可以容易證明,二叉樹中最長鏈的起始、結束結點均為葉子結點。

1

/*典型的·樹形dp:最長鏈=max(所有左孩子單鏈最長+右孩子單鏈最長),當前節點的單鏈最長是遞推出來的,當前節點的單鏈最長=max(左右孩子單鏈最長)+1;*/2

#define n 100010

3 #include4

using

namespace

std;

5 #include6

int lian[n],ans=0;7

intl[n],r[n],n,c[n];

8void

input()915

}16int dfs(int

k)17

24int

main()

25

樹的最長路徑(直徑) codevs1814

樹的最長路徑即樹上的最遠點對,也被稱為樹的直徑。這可以用兩遍dfs來求。第一遍dfs先任選乙個點,找出離這個點最遠的點maxd。該點必為最長路徑上的乙個端點 可以用反證法證明 再從maxd這個點出發再進行一次dfs就能找到另乙個端點。include include include includeus...

樹形DP 樹的最長路徑

給定一棵樹,樹中包含 nn 個結點 編號11 nn 和 n 1n 1 條無向邊,每條邊都有乙個權值。現在請你找到樹中的一條最長路徑。換句話說,要找到一條路徑,使得使得路徑兩端的點的距離最遠。注意 路徑中可以只包含乙個點。輸入格式 第一行包含整數 nn。接下來 n 1n 1 行,每行包含三個整數 ai...

hdu 6201 樹形dp SPFA最長路

n個城市都在賣一種書,該書的 在i城市為cost i 商人打算從某個城市出發到另乙個城市結束,途中可以在任意城市買書或者賣書,但一次只能買一本和賣一本,乙個城市到另乙個城市需要花費。問商人最大收益是多少。方法一 樹形dp 設dp u 0 表示在以u為根的樹中賣一本書獲得的最大價值,dp u 1 表示...