樹的直徑及其陰間變式總結

2022-09-14 09:51:13 字數 1086 閱讀 5464

給出一棵樹,求出它直徑的長度。

這個問題不必多說,兩種演算法(證明略,**略)。

演算法二:樹形 dp。

給出一棵樹,求出它直徑的長度,以及所有直徑都經過的邊的條數。

我們設 \(dis_\) 表示樹上節點 \(u\) 到節點 \(v\) 的距離。

首先看第一問,求樹的直徑。見上文\(……\)這裡略。

再看第二問。先看圖,假設我們第一問求出的直徑為加粗的那些點構成的鏈。

我們發現,\(dis_=dis_\),這意味著下圖中的這些點也能成為樹的直徑。

所以,節點 \(2\) 左邊的邊一定不是所有直徑都經過的。

同理,\(dis_=dis_\),所以節點 \(4\) 右邊的邊一定不是所有直徑都經過的。

所以我們只要將第一問中求出的樹的直徑上的節點記錄下來。

再求出如下圖所示以樹的直徑上的點 \(x\) 為根的這些子樹中,根到葉子的最大距離 \(mdep_\) 以及節點 \(x\) 到直徑左端點和直徑右端點的距離\(ldis_x\)、\(rdis_x\)。然後將 \(mdep_\) 與 \(ldis_x\)、\(rdis_x\) 作比較,排除一定不是所有直徑都經過的邊,即可求出第二問的答案。

給定一棵樹,對於每一條邊,把這條邊刪掉之後得到的兩棵樹的直徑是多少?

對於這個問題,首先,我們需要預處理未分割前樹的直徑以及樹的直徑上的節點。

然後對以樹的直徑兩端為根分別跑一遍dfs。這個dfs要維護的資訊為:以任意節點 \(x\) 為子樹的的直徑。

最後,我們就可以愉快的分類討論了。

\(\texttt\)

基環樹樹的直徑問題

動態刪邊樹的直徑問題。

SDOI2013 直徑(樹的直徑)

小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...

樹的直徑 板子

不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...

樹的直徑相關

一.樹直徑的定義.顯然一棵樹可以有不止一條直徑.二.樹直徑的求解.一般來說樹的直徑可以用樹形dp來求.設f i 0 1 f i 0 1 f i 0 1 表示在i ii的子樹中以i ii為一端的最長 次長鏈長度,我們可以很容易dp出來這個值,樹的直徑就是f i 0 f i 1 f i 0 f i 1 ...