poj1987 樹的點分治

2021-08-04 21:10:44 字數 721 閱讀 5655

題意:給你一顆n(n<=40000)的樹,求兩個點的距離<=k的點的對數

題解:關於樹的分治,這我還是第一次遇到,決定好好總結下,以備以後再遇到這種型別的題

分治要分的均勻,而要分治一顆樹,最好的位置自然是樹的重心,由重心開始,分治子樹

這道題,對於每顆子樹,點對之間的距離分為兩種 1.過根節點 2.不過根節點

很顯然,第二種情況可以作為子情況討論。在計算一顆樹的過根節點的點對數

是,還要減去其兩個點在同一子樹中的情況,避免重複計算

code:

#include#include#include#include#include#includeconst int maxn=40005;

const int inf=0x3f3f3f3f;

using namespace std;

struct nodeh[maxn<<1];

int n,m,cnt,fir[maxn];

int num[maxn],f[maxn];

int root,allnode,d[maxn];

int deep[maxn],ans,k;

bool vis[maxn];

inline void addedge(int t1,int t2,int v)

void getroot(int s,int fa)

f[s]=max(f[s],allnode-num[s]);

if(f[s]

poj 1987 節點距離小於等於K(樹DP)

這題和poj 1741是一模一樣的 但是1741能ac的 在這裡卻是tle,暫時沒看出 出現了問題。ac include include include include include include include include include include include include i...

POJ 1741 Tree 樹的分治 點分治

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

POJ 1741 樹的點分治

第一次接觸樹分治。打算今晚學的,先看了一蛤樹的重心怎麼求,之後知道了重心後再來看這道題,這種題是不是啟發式合併也可以?一遍一遍加邊地合併上去,然後列舉小的塊的每個點,二分大的塊,然而這還是要遍歷一遍小的塊再遍歷一遍大的塊才能預處理出道鏈結的兩個點的距離,就不滿足啟發式合併的nlogn了,因為要對大的...