樹的重心的性質及其證明


想了我好長時間。。。

  1. 樹的重心如果不唯一,則至多有兩個,且這兩個重心相鄰
    • 先假設有兩個重心 \(u,v\) 不相鄰,考慮它們之間的這條路徑,則至少有三個節點(以下的 “它們之間的路徑” 都是指 \(u,v\) 之間的路徑)
    • \(u\)不包含它們之間的這條路徑的若干子樹中(就是有一個子樹是以它們路徑上與 \(u\) 相鄰的那個點為根的,先排除那個子樹),最小的子樹大小是 \(size_u\),則 \(v\) 的包含它們路徑的那個子樹的大小為 \(size_u+k,k\ge 2\)。那么這個子樹不能是 \(u\) 的大小最大的子樹,否則 \(v\) 的這個包含它們之間的路徑的子樹,大小比它還大,\(v\) 就不是重心了
    • \(v\) 進行相同的分析,得到同樣結論
    • 那么 \(u,v\) 最大的子樹就只能分別是包含它們之間路徑的那個子樹,假設從它們之間的路徑上(不包含它們)的點,延伸出去的點的個數為 \(size\)(這個 \(size\) 已經把路徑上的點算上了),則它們這個最大的子樹的大小就分別是 \(v,u\)不包含它們之間路徑的子樹的大小和,加 \(size+1\),又因為它們都是重心,最大子樹都最小,則上面所述的這個 “\(v,u\) 的不包含它們之間路徑的子樹的大小和” 應該相等,設其為 \(size'\)
    • 但是發現,若從它們之間的路徑上(不包含它們本身)取一點,則這個點沿着它們之間路徑的兩個子樹應該都小於 \(size'+size+1\),而其他子樹顯然都小於 \(size'\),那么 \(u,v\) 都不是重心,矛盾
    • 則重心必須相鄰,又因為這是一個樹,所以最多只有兩個點相鄰,最多兩個重心
  2. 一個點是重心,等價於,以這個點為根,它的每個子樹的大小,都不會超過整個樹大小的一半
    • 假設重心是 \(u\),它的一個子樹大小超過整個樹大小的一半,設這個子樹的根是 \(v\)(與 \(u\) 相鄰)
    • \(size_i\) 表示以 \(i\) 為根的子樹大小,則 \(size_v>\frac{size_u}{2}\)
    • 那么,\(u\) 除了子樹 \(v\) 以外的其它所有子樹(把 \(u\) 本身也計算在內)的大小是 \(size_u-size_v\)
    • 所以,如果以 \(v\) 為重心,則它的一個子樹是 \(size_u-size_v\),這個子樹就是以 \(u\) 為根的那個。\(size_u-size_v<size_v\),此時,\(v\) “往上”的那個以 \(u\) 為根的子樹小於 \(u\) 的最大子樹大小,而其他“往下”的子樹顯然也小於,所以可以說明,也說明如果以 \(v\) 為重心,最大子樹的大小小於以 \(u\) 為根最大子樹的大小,則矛盾。得證
    • 再來推若每個子樹都不超過整個樹的一半,那么一定是重心
    • 設這個每個子樹都不超過整個樹一半的節點為 \(u\),重心為 \(v\),考慮 \(u,v\) 之間的路徑
    • \(v\) 總會有一個子樹包含 \(u\),(就是包含它們之間路徑的那一個),從而包含了,\(u\) 的除了包含這它們之間路徑的那個子樹,的所有其他子樹,由於 \(u\) 任意子樹大小小於總體的一半,所以 \(v\) 的這個子樹,也就是 \(u\) 的剩余所有子樹,大小 \(\ge \frac{size_u}{2}\)
    • 那么顯然 \(v\) 不是重心,矛盾。這樣,對於任意的 \(v\neq u\),都不是重心,則 \(u\) 是重心(當然可能存在一個相鄰的點,使得它們都有一個等於整體一半的子樹,那么就是有兩個重心的情況)
    • 則也就順帶着說明了,只有在總點數為偶數時,才可能會出現有兩個重心的情況,這兩個重心相鄰,且都只有兩個子樹,大小分別為 \(\frac{num}{2},\frac{num}{2}-1\)
  3. 樹中所有點到某個點的距離和中,到重心的距離和是最小的。如果有兩個重心,那么到它們的距離和一樣。更進一步,距離和最小與是重心等價
    • 一開始想大力推式子然后反證法證明,結果推了半天發現好像假了
    • 實際上應該是用調整法
    • 就是先假設當前選擇一個點 \(u\),然后看我們把選擇的點調整到一個與 \(u\) 相鄰的點,看能不能使得距離和更小
    • 什么樣的點能滿足上面的性質?那就是以它為根的子樹大小大於以 \(u\) 為根的大小的一半的點,這樣讓那些其他子樹的一共小於一半的點多走 \(1\),讓這大於一半的點少走 \(1\),總體少走了
    • 直到所有相鄰節點為根的子樹都小於當前的 \(u\) 的一半,那么無論往哪個點上再進行移動,都只會使距離和更大,而這樣的點,就是重心,得證
  4. 如果一個樹增添,或刪去一個葉子,則整個樹的同一個重心最多移動一個節點
    • 如果是增加節點,那么如果需要移動的話,則是沿着重心和新增的節點之間的路徑來移動,這種情況肯定是因為新增節點使得包含它們之間路徑的那個子樹過大(大於整個樹的一半,根據第二條性質)。而往那移動一位,就會讓這個子樹減少的大小大於等於一,那么就又小於等於了這個樹的一半,又由於樹最多有兩個重心且我們討論的是“同一個重心”的移動,所以移動一次就夠了,移動更多就又不是重心了
    • 如果是刪除節點,刪除以后導致包含被刪除的節點的子樹大小減小,那么其他子樹可能就大於整個樹大小的一半了。則重心往這個子樹上移動一位,至於為什么只移動一位,和上面的分析相似
  5. 通過連接一條端點分別在兩個樹的邊,來將兩個樹合並成一個,那么新的重心肯定是在原來這兩個樹的重心的路徑上
    • 不妨假設連接的兩個點就是兩個樹原來的根
    • 然后可以發現,仍然可以用一種不斷調整的方法,假設原先兩個重心分別是 \(u,v\),從 \(u\) 開始調整,當目前仍在 \(u\) 所在的原先的那顆樹中時,肯定是朝着根調整,因為是根那個方向被接入了另一個樹導致大小變大
    • 如果還沒調整到原先的根,就符合了最大子樹小於等於總結點數一半的條件,自然符合性質,這就說明了,如果新重心在原來 \(u\) 所在的那個子樹上的話,一定在 \(u\) 到它原來的根的路徑上
    • 同理可以說明,如果新重心在 \(v\) 所在的那個子樹上,一定在 \(u\) 到它原來那個根的路徑上
    • 把這兩個合起來就是本條性質了

 

一個月后,終於把坑填完了
比如說 洛谷P4299 首都 那個題,要用到第五條性質(或是第四條),我之前也是因為做到這個題才想起來整理一下樹重心的性質的,而且發現網上的資源大都只是把結論寫上,有證明的很少,所以也花了不少時間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM