参考:
给出N(1 <= N <= 10000)个结点的树,求使得路径u -> v长度不超过k的点对(u, v)的个数。
点分治法:每次找出分治点,求经过其的路径的点对,子树递归处理即可。
会有重复值,需要减去子节点相关的一些值
注意技巧:
删除点的办法。adj[r ^ 1].mk = false;
找出分支点的方法。(与直径中心的差别 )
算法就是基于树的分治,对于每个树,先要选定一个根节点,这个根节点要保证它的深度尽量小,然后才可以保证时间复杂度。选根的过程大致就是一次DFS,找到以 I 为根节点时儿子最多的子树的儿子树最少的 I 就可以作为根了。
#pragma comment(linker, /STACK:1024000000,1024000000)
#include
#include
#include
#include
#include
#include
#include
#include
#include