ACM 樹重心的性質及動態維護

2022-09-17 23:48:12 字數 1897 閱讀 6128

本文**

求樹重心的方法:(nlogn)

還記得曾經提到過的樹的「重心」嗎?重心的定義是:以這個點為根,那麼所有的子樹(不算整個樹自身)的大小都不超過整個樹大小的一半。

樹的重心的乙個的性質:

樹中所有點到某個點的距離和中,到重心的距離和是最小的;如果有兩個重心,那麼他們的距離和一樣。

這也是「道路修建」帶來的啟發。(證明:調整法)

樹的重心的另乙個性質:

把兩個樹通過一條邊相連得到乙個新的樹,那麼新的樹的重心在連線原來兩個樹的重心的路徑上。

這個讓「重心」名副其實了。。。(證明:。。。自己好好思考一下吧。。。)

還有乙個性質:

把乙個樹新增或刪除乙個葉子,那麼它的重心最多隻移動一條邊的距離。

嗯,不錯,有這麼多性質,可以出不少噁心題了。。。

不過,我還是更關心乙個事情:重心的動態維護。

如何動態呢?

情景1:新增一片葉子

根據已有性質,新增一片葉子之後新的重心要麼不動要麼向那片葉子的方向移動一下。這樣,可以用乙個link-cut tree來維護。

我們以重心為根建立這個動態樹。每個節點維護它所在的子樹的大小。新增葉子等於向一條路徑上的維護值增加1,這個可以通過打標記實現。發現不得不移動的時候進行一次換根的操作。因為只可能移動1,所以換根的操作是可以完成的。

我們甚至還可以維護所有點到重心的距離和!這個只需給每個點加乙個維護值:這個點為根的子樹中所有點到這個點的距離和,通過稍微有點複雜的標記系統還是可以維護的。

情景2:刪除一片葉子

只有刪除操作?那麼離線改成新增吧。。。

不允許離線?那麼我們要換乙個思路:

定義稍微廣義的樹的重心:每個點有乙個非負權,每個邊有個正的長度,到所有點的權乘以距離的和最小的點定義為重心。

注意:樹的重心的位置和邊的長度沒有關係!。

在只有權值修改的情況下,我們可以利用樹分治配合基本資料結構來維護樹的重心:

注意到,我們可以維護乙個子樹內的點的權值和(利用dfs序)。這樣給定一條邊,我們就能夠知道樹的重心在這條邊的哪邊(看看哪邊權值和大就行了)。

這樣,我們可以先找乙個比較靠近中心的邊,問問應該向哪邊走,再分治下去,就像樹分治那樣(類似二分查詢?)。

當然,要想一下其他的技巧來對付」星型資料「,這個應該不難(通過拆點、拆邊的技巧)。

利用這個廣義一點的重心,我們發現,刪除操作其實就是把權修改成0而已,可以在log^2n的時間內動態維護了。

如何處理多重心的情況?」抖動「一下權值使得只有乙個重心不就行了。。。那另乙個重心在**?這個只是個細節問題。。。

能否維護距離和?能否在logn的時間內維護?歡迎討論(將子樹和查詢與樹分治結合起來?。。。)。

情景3:移動一片葉子

把乙個葉子移動到另乙個地方。

這個怎麼維護呢?其實,我們發現,新的重心應該在原來的重心和葉子新的位置的連線上(證明?應該是對的吧),移動距離很小。於是,也就可以維護了。

情景4:移動乙個子樹(被移動的子樹小於原樹的一半,並且保持它的根不變)

這個可以維護嗎?

有乙個可以和link-cut tree配合使用的工具,叫做euler-tour tree,它維護樹的尤拉迴路,基本元素是邊。利用它,可以方便的完成子樹的移動,並且給定一條有向邊,可以回答這條邊指向的子樹的大小(eurler-tour tree中沒有」根「以及」父親「這個概念!)。如果上面的那個論斷是對的,那麼這個應該可以維護了(複雜度?log^2n吧。。。)

另乙個思路是樹塊劃分,把樹劃分成若干聯通塊,並且在查詢的時候合併相鄰的聯通塊使得每個聯通塊的大小都是sqrt(n)的級別。這個東西對維護是否有幫助?歡迎交流。。。

情景5:開始n個乙個點的樹,每次用一條邊合併兩個樹,要求回答新的樹的重心

等待你去探索

情景6:未來的某一天,某省省選出了乙個叫做」瘋狂的重心「的資料結構題,時限1分鐘,記憶體若干g,標程幾十k,當場無人做。。。。。。

樹的重心維護 動態樹 資源運輸

上交的寢室沒網實在是.據說acm時除錯只有5分鐘,基本上不用gdb,這點真是硬傷了,一般來說有難度的題目我要麼不除錯,要麼調比較久,看來有必要鍛鍊靜態除錯。題意 一開始有n個點,每次可以選擇兩個點連邊,保證每次連邊後是乙個森林,對於每棵樹來說,要選擇乙個點,樹中其他點到它的距離和為此樹的權值,要求每...

樹的重心(性質 模版)

在一棵樹上找到乙個點,把這個點作為樹的根的有根樹,最大子樹的節點數最小。就是把該點去掉以後,最大連通塊的節點數最小 1 一棵樹的重心至多有兩個,且相鄰。2 樹中某個點到所有點到距離之和中,到重心的距離之和是最小的。如果有兩個重心,那麼到它們的距離之和一樣。3 把兩棵樹用一條邊相連,新樹的重心在原來兩...

樹的重心的性質及其證明

想了我好長時間。樹的重心如果不唯一,則至多有兩個,且這兩個重心相鄰 乙個點是重心,等價於,以這個點為根,它的每個子樹的大小,都不會超過整個樹大小的一半 樹中所有點到某個點的距離和中,到重心的距離和是最小的。如果有兩個重心,那麼到它們的距離和一樣。更進一步,距離和最小與是重心等價 如果乙個樹增添,或刪...