POJ 1741 樹分治入門

2021-07-24 04:22:31 字數 808 閱讀 6729

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f;

const

int max=1e4+5;

//點分治 cursize-樹當前大小 curroot-當前樹的根

//son[i]節點i的子節點的個數 d[i]節點i到curroot的距離 f[i]節點i最大子樹的大小

int n,k,cursize,curroot,ans,son[max],d[max],f[max];

bool used[max]; //used[i]節點i是否計算完成

vector

int,int> > g[max]; //graph

vector

depth; //把計算後的d[i]儲存進來

void getroot(int s,int pre)

f[s]=max(f[s],cursize-son[s]-1);

if (f[s]void getdepth(int s,int pre)

}int calc(int s,int init)

void solve(int s)

}}int main()

f[0]=cursize=n;

getroot(1,curroot=0);

ans=0;

solve(curroot);

cout

0;}

POJ 1741 樹的分治

題意就是求樹上距離小於等於k的點對有多少個 n2的演算法肯定不行,因為1w個點 這就需要分治。可以看09年漆子超的 本題用到的是關於點的分治。乙個重要的問題是,為了防止退化,所以每次都要找到樹的重心然後分治下去,所謂重心,就是刪掉此結點後,剩下的結點最多的樹結點個數最小。每次分治,我們首先算出重心,...

POJ 1741 樹的分治

tree 求樹上兩點最短距離不超過 k 的對數。通過樹的分治的方法,從根節點自上而下開始求其不同子樹上的兩點通過該點的最短距離小於 k 的對數。有兩點需要注意 1.求某節點不同子樹滿足條件的兩點不好直接求。可以通過先求該節點的所有子節點滿足條件的個數,然後減去其子樹內所有滿足條件的點的個數。這個通過...

poj 1741 樹的分治

看了網上各種大神的樹的分治的模板,然後自己敲了乙個。直接上 了,晚上再寫乙個學習筆記,喪心病狂的poj,上次一直跪在vector上,這次覺得不用vector寫了。include include include include include include include define ll lon...