点分治,是一种针对可带权树上简单路径统计问题的算法。
就POJ 1741来说:
问题:给一棵边带权树,问两点之间的距离小于等于K的点对有多少个。
解决:
当前有一个节点u,那么树上的路径可分为两种:(1)经过节点u的 (2)不经过节点u的
第(2)种路径,一定在u的某个子节点构成的子树中。在其中找一点递归下去即可。
1 void solve(int u) { 2 ans+=calc(u,0); vis[u]=1; 3 for(int i=fro[u];i;i=nxt[i]) { 4 int v=to[i]; 5 if(vis[v]) continue; 6 ans-=calc(v,w[i]); 7 root=0,size=sz[v]; 8 findrt(v,0); solve(root); 9 } 10 }