2602 樹的直徑(最遠點對,樹狀dp

2021-09-28 13:31:16 字數 866 閱讀 2781

一棵樹的直徑就是這棵樹上存在的最長路徑。現在有一棵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 可以發現最長路徑具有直徑的合併性質,即兩個區間選點的最長路徑端點一定是原本兩個區間最...