poj 1741 tree 樹的點分治

2021-07-22 22:06:59 字數 707 閱讀 7282

很經典的點分治入門題

**:

**參考:

其實還是有很多種姿態來搞,各個題解也都很清楚,差不多也就是那麼個意思,所以只是來總結一下需要注意和難以理解的東西

1.為什麼每次要找重心?

給定的樹並不確定,所以樹的深度直接影響時間複雜度(因為你每一次都需要去找經過這乙個節點且兩點之間距離<=k的,即是(i,j) d[i]+d[j]<=k)而每一次找重心,就可以確保樹的深度至少縮小一半,把複雜度降為log(n)

2.為什麼ans先是要加然後又要減?

void get_root(int u,int fa){//得到子樹的重心

s[u]=1;//初始size為1

f[u]=0;//注意初始化一開始就忘了

for(int i=0;i

POJ1741 Tree(樹的點分治)

題目給一棵邊帶權的樹,統計路徑長度 k的點對數。樓教主男人八題之一,分治演算法在樹上的應用。一開始看 看不懂,以為重心和距離那些是一遍預處理得來的。感覺上不敢想每棵子樹都求一遍重心和距離 那樣時間複雜度怎麼會只有o nlogn 後來想通了,真的是對於每顆子樹都把其所有結點單獨提取出來,而且這麼做就是...

poj 1741 Tree(樹的點分治)

給出乙個n個結點的樹和乙個整數k,問有多少個距離不超過k的點對。首先對於乙個樹中的點對,要麼經過根結點,要麼不經過。所以我們可以把經過根節點的符合點對統計出來。接著對於每乙個子樹再次運算。如果不用點分治的技巧,時間複雜度可能退化成 o n 2 鏈 如果對於子樹重新選根,找到樹的重心,就一定可以保證時...

POJ 1741 Tree 樹的分治 點分治

題目大意 給出一顆無根樹和每條邊的權值,求出樹上兩個點之間距離 k的點的對數。思路 樹的點分治。利用遞迴和求樹的重心來解決這類問題。因為滿足題意的點對一共只有兩種 1.在以該節點的子樹中且不經過該節點。2.路徑經過該節點。對於第一種點,我們遞迴處理 第二種點,我們可以將所有子樹的節點到這個子樹的根節...