POJ 1741 Tree 點分治模板題

2021-10-23 17:17:59 字數 1081 閱讀 5206

題目大意:給出一棵 n 個節點的樹,現在定義 dis( x , y ) 為點 x 和點 y 之間的路徑長度,現在問 dis ( x , y ) <= k 的點對有多少

題目分析:點分治的模板題目,乾貨部落格:

自己寫的時候寫了一堆bug。。提示一下,如果是wa的話可能有點無從下手,但如果用的是鏈式前向星,還仍然 tle 的話,大概率是重心的地方出現細節問題了,因為如果重心使用不當,會將時間複雜度退化為 n*n*logn 

**:

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

typedef long long ll;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const int n=1e4+100;

int ans,root,tsize,wt[n],sz[n],path[n],tot,cnt,n,k;

int nt[n<<1],to[n<<1],w[n<<1],head[n];

bool vis[n];

void addedge(int u,int v,int val)

void get_root(int u,int fa)

wt[u]=max(wt[u],tsize-sz[u]);

if(wt[root]>wt[u])

root=u;

}void get_path(int u,int fa,int deep)

}int calc(int u,int deep)

return ans;

}void solve(int u)

}void init(int n)

int main()

get_root(1,-1);

solve(root);

printf("%d\n",ans);

} return 0;

}

樹形 點分治 POJ 1741 Tree

通道 題意 有多少對 u,v 的距離小於k 思路 將無根樹轉化成有根樹進行觀察。滿足條件的點對有兩種情況 兩個點的路徑橫跨樹根,兩個點位於同一顆子樹中。如果我們已經知道了此時所有點到根的距離a i a x a y k的 x,y 對數就是結果,這個可以通過排序之後o n 的複雜度求出。然後根據分治的思...

POJ 1741 Tree 樹的分治 點分治

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

poj 1741 tree 樹的點分治

很經典的點分治入門題 參考 其實還是有很多種姿態來搞,各個題解也都很清楚,差不多也就是那麼個意思,所以只是來總結一下需要注意和難以理解的東西 1.為什麼每次要找重心?給定的樹並不確定,所以樹的深度直接影響時間複雜度 因為你每一次都需要去找經過這乙個節點且兩點之間距離 k的,即是 i,j d i d ...