学习笔记—点分治

点分治,是一种针对可带权树上简单路径统计问题的算法。

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 }

猜你喜欢

转载自www.cnblogs.com/qq8260573/p/10803815.html