POJ 1741Tree(樹分治模板)

2021-08-20 15:03:08 字數 454 閱讀 8377

題意:求樹上距離小於等於m的點對有多少個。

#include#include#include#include#includeusing namespace std;

const int maxn=1e4+100;

struct node

};vectora[maxn];

int hvy,n,m,vis[maxn],siz[maxn],ma[maxn];

int s; //樹的大小

void dfs_hvy(int u,int fa)//找重心

return res;

}int ans;

void dfs_ans(int u)

{ vis[u]=1;

ans+=dfs_sum(u,0);//加上經過重心的點對數(加的裡面包括了不經過的,需要在下面再減去)

for(int i=0;i從這篇部落格學到的

poj 1741 Tree 樹的分治

解 文中有,就是把路徑分成經過樹根,和不經過樹根兩類,每次處理經過樹根的,然後剩下的子樹部分可以遞迴處理,如果每次選取樹的重心,那麼可以保證最多遞迴logn層。經過樹根的先排序,然後o n 的複雜度就能算出,那麼每層的複雜度nlogn,最多遞迴logn層,總複雜度nlogn 2 include in...

poj 1741 Tree 樹的分治

求樹上倆結點之間距離小於k的結點對個數 倆個點a,b的公共祖先為c,那麼這倆個點的距離就可以用dis a,c dis b,c 表示,我們可以不斷的處理這樣c,然後計算距離,處理點對,為了使平均效能最好,我們需要找的c為每一棵子樹的重心 需要注意的算點對的時候這種方法成立的條件是倆個點不在同一顆子樹上...

POJ 1741 Tree 樹的分治

題目 題意 給定一棵樹,有n個點和n 1條邊,邊有邊權,給出乙個k,求樹上任意兩點間的最短距離不大於k的個數 思路 看了09年漆子超的 利用分治法,每次找樹的重心,重心即是在當前樹中刪掉此點後,節點數最多的子樹的節點數最小,找到重心後,求其所有子孫到其的距離,然後統計一下兩兩之和不大於k的個數,另外...