一棵樹的直徑就是這棵樹上存在的最長路徑。現在有一棵n個節點的樹,現在想知道這棵樹的直徑包含的邊的個數是多少?
如圖所示的資料,這棵樹的直徑為(1-2-3-6-9)這條路徑,包含的邊的個數為4,所以答案是4。
輸入第1行:乙個整數n,表示樹上的節點個數。(1<=n<=100000)
第2-n行:每行有兩個整數u,v,表示u與v之間有一條路徑。(1<=u,v<=n)
輸出輸出乙個整數,表示這棵樹直徑所包含的邊的個數。
輸入樣例
101 2
2 33 4
3 53 6
3 73 10
6 86 9
輸出樣例
4用 dp[i]維護以 i 為根的子樹的深度,
dp[i] = max(dp[i], dp[j]+1)(j 為 i 的兒子)。
求出任意節點 i 子樹深度之後,經過 i 的最長路徑就是最深的兩顆子樹深度相加。
和這題有點像
#include using namespace std;
int n,x,y,root;
vectorson[100010];
int v[100010],dp[100010];
int f(int x)
else if
(dp[tmp]+1> m2)
m2=dp[tmp]+1;
} dp[x]=m1;
return m1+m2;
}int main()
for(int i=1;i<=n;i++)
if(!v[i])
cout<(root)
; return 0;
}
51nod 2602 樹的直徑 最遠點對
給出一顆 n 個節點的樹,求樹上最遠點對。用 d p i dp i dp i 維護以 i 為根的子樹的深度,dp i m ax d p i dp j 1 dp i max dp i dp j 1 dp i max dp i dp j 1 j 為 i 的兒子 求出任意節點 i 子樹深度之後,經過 i ...
C 樹上的最遠點對
51nod 1766 vjudge n個點被n 1條邊連線成了一顆樹,給出 a b 和 c d 兩個區間,表示點的標號請你求出兩個區間內各選一點之間的最大距離,即你需要求出max dis i,j a i b,c j d ps 建議使用讀入優化 第一行乙個數字 n n 100000。第二行到第n行每行...
51NOD 1766 樹上的最遠點對
n 個點被n 1條邊連線成了一顆樹,邊有權值wi 有q 個詢問,給出 a b 和 c,d 兩個區間,表示點的標號請你求出兩個區間內各選一點之間的最大距離,即你需要求出 ma x 1 n,q 105,1 wi 104 可以發現最長路徑具有直徑的合併性質,即兩個區間選點的最長路徑端點一定是原本兩個區間最...