時間限制: 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 表示...