關於樹的直徑

2022-05-31 05:24:16 字數 1246 閱讀 8003

題解:

1.樹的直徑有一種找法是找兩次最遠點

於是這可以證明乙個性質

樹上乙個點到最遠點的距離等於到一條直徑兩個端點的較大值

2.合併兩顆樹的時候,新樹的直徑為兩顆樹的4個直徑兩兩組合的最大值(有多條取一條就可以)

3.另乙個性質

樹的所有直徑一定有乙個公共交點

對於兩條,我們很好證,只需要找到他們之間的路徑即可反證

對於兩條以上,我們會發現如果如果有多個交點,就構成環了

例題:

1.現在要摧毀一些點,使得這棵樹分成兩棵小樹,第一棵小樹的直 徑為d1,且有不超過c1個點可能在直徑的端點,第二棵小樹直徑為 d 2,且有不超過c 2個點可能在直徑的端點.

n<=200

題解:

首先比較顯然的是我們要去列舉以哪個點切割成兩顆樹(如果還有很多兒子就把多的兒子都刪了)

然後就等於變成了乙個問題,求一顆子樹內滿足直徑為d,不超過c個點為直徑端點

這個問題看上去並不好解決

這裡有個方法是:去列舉樹的中心(樹的直徑的中心)

我們考慮,直徑對於我們來說,肯定是越短越好,點肯定是刪的越少越好

所以對於列舉的中心點,我們會把到它c/2以內的點保留

對於大於等於c/2的,我們保留k個就可以了

然後奇數還要討論一下

反正這樣被變成碼農題了。。

2.給定一棵 n 個節點的樹,你可以進行 n − 1 次操作,每次操作步驟如下: 選擇 u, v 兩個度數為 1 的節點。 將 u, v 之間的距離加到 ans 上。 將 u 從樹上刪除。 求乙個操作序列使得 ans 最大。

這個比較容易聯想到直徑

進一步我們可以想到乙個點到最遠點的距離是到直徑兩端點之一

於是我們會發現,我們只要先刪外面的點,再把直徑之間的點逐一刪除就行了

那如果有多條直徑呢,我們會發現進行這兩個過程是分別等價的

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 ...