1. 程式人生 > >淺談樹分治

淺談樹分治

因為樹具有一般的圖沒有的特殊性質,所以樹考的比圖要多得多。而樹上分治演算法則是解決樹上路徑資訊靜態統計的一大利器。

點分治

以點為分界線的分治,每次選取一個點,把經過這個點的路徑資訊統計完,再在這個點的子樹裡遞迴統計沒有經過這個點的路徑資訊,這樣可以保證不重不漏的統計每一條路徑的資訊。如果每次選擇重心為這個分界線,那麼每次聯通塊大小至少會縮小一半,所以每個點最多被遍歷\(logn\)次,複雜度就得到了保證。而當前聯通塊的重心只需要\(O(n)\)的時間就可以找到了。

邊分治

樹可以用點分治,當然也可以按邊分治。每次選取一條邊,使得刪掉這條邊之後的兩個聯通塊大小盡量平均,暫時稱這條邊為重邊。因為按照邊分治每次只會把一個聯通塊變成兩個,所以對於某些資訊邊分治比點分治更好統計。

但是,菊花圖會卡爆上述做法。所以邊分治之前,需要把樹重建。在講重建樹之前,我們先來講講邊分治的時間複雜度分析吧。

假設當前聯通塊中,紅色的邊\(U-V\)是重邊,\(U\)以及其子樹大小為\(s\)\(V\)以及其子樹大小為\(n-s\)\(s\geqslant n-s\)\(X\)\(U\)的所有兒子中子樹大小最大的點,其子樹大小為\(p\),整個聯通塊中點度最大為\(d\)

我們考慮另一種方案\(U-X\),顯然\(p\geqslant (s-1)/(d-1)\),因為\(p\)小於\(s\)\(U-V\)是重邊,所以\(n-p\geqslant s\)。代入前面那個式子可得:
\[ \because n-p\geqslant s,\therefore n-s\geqslant p\\ \because p\geqslant (s-1)/(d-1),\therefore n-s\geqslant(s-1)/(d-1)\\ \therefore d*n-d*s-n+s\geqslant s-1\\ \therefore (d-1)*n-d*s\geqslant -1\\ \therefore (d-1)*n+1\geqslant d*s\\ \therefore s\leqslant \frac{(d-1)*n+1}{d}\\ \]


\(d\)是常數時,複雜度顯然可以接受。但是……

一花一世界,一菊一\(TLE\)

所以我們需要重建樹,利用虛擬結點和原本並不存在的邊把原樹建成一棵二叉樹,記憶體也就翻一倍。