POJ1741 Tree(樹的點分治)

2022-05-02 19:24:07 字數 1258 閱讀 7348

題目給一棵邊帶權的樹,統計路徑長度<=k的點對數。

樓教主男人八題之一,分治演算法在樹上的應用。

一開始看**看不懂,以為重心和距離那些是一遍預處理得來的。。感覺上不敢想每棵子樹都求一遍重心和距離——那樣時間複雜度怎麼會只有o(nlogn)?

後來想通了,真的是對於每顆子樹都把其所有結點單獨提取出來,而且這麼做就是o(nlogn)!

寫這一題,捋清思路後分了好幾個函式逐一實現,感覺框架挺清晰的,提交之後就1a還是很爽的。

1 #include2 #include3 #include4

using

namespace

std;

5#define inf (1<<30)

6#define maxn 1111178

struct

edgeedge[maxn<<1

];11

intne,head[maxn];

12void addedge(int u,int v,int

w)16

17int

n,k,ans;

18bool

vis[maxn];

1920

intcentre,minimum,size[maxn];

21void getsize(int u,int

fa)29}30

void getcentre(int u,int fa,int &tot)

38if(minimum>res)42}

4344

inta[maxn],b[maxn],an,bn;

45void dfs(int u,int fa,int

dist)52}

53int count(int *c,int &cn)

61return

res;62}

6364

void conquer(int

u)73 ans+=count(a,an);74}

75void divide(int

u)85}86

87int

main()

96 ans=0

;97 memset(vis,0,sizeof

(vis));

98 divide(1

);99 printf("

%d\n

",ans);

100}

101return0;

102 }

poj 1741 tree 樹的點分治

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

poj 1741 Tree(樹的點分治)

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

POJ 1741 Tree 樹的分治 點分治

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