題解:
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 ...