1. 程式人生 > 其它 >樹的直徑與重心學習筆記

樹的直徑與重心學習筆記

此文為完成任務所設,可能不易懂,能看懂就將就著看吧

1.定義

樹的定義:不存在環且聯通的圖。

樹的直徑:樹中的最長鏈

樹的重心:為一個點,以此點為根,最大子樹的大小最小。

2.求法

樹的直徑求法分兩種:兩次 DFS/BFS 與樹形 dp 。

首先講好理解點的樹形 dp 。

其實很簡單,每個節點維護子樹到這個點的最長鏈和次長鏈。

對於一個子樹,能做出貢獻的顯然只有最長鏈。

將由子樹最長鏈得到的鏈與此節點的最長鏈與次長鏈作比較。

若比最長鏈大,則將原最長鏈賦給次長鏈,最長鏈更新。

若比次長鏈大,直接更新次長鏈。

每個節點的最長鏈與次長鏈相加即可。

然後是兩次 DFS/BFS 。

第一遍找到與任意節點最遠的節點,第二遍從找到的節點出發,找到最遠的節點。

兩次的節點即為樹的直徑。

樹的重心:

一次 DFS ,每次記錄下當前子樹的大小,最後一個子樹大小就是總節點數-此子樹大小。

算出最大子樹大小後就嘗試更新答案。注意:可能有一個,也可能有兩個。