题目大意
给出一颗无向有边权树,求到两点x,y距离相等的节点数。经典的LCA倍增算法模板。
题目链接CodeForces 519E
题意解析
求到两节点的距离想的的节点数,最普遍的解法是for循环遍历所有节点,对每一个节点z,
分别求z到两节点的距离,如果相等,counter变量就加1,然后输出counter。但不幸的是,数据很大,
这种解法会超时。为什么要用倍增算法?因为倍增算法可以顺便求出某节点的孩子的个数,还能求出
某节点的第K个祖先。通过这两个信息,我们可以不遍历所有点而直接求出答案。
首先奇偶剪枝,当x,y两点间距离为奇数时一定不存在这样的点(你可以随便画个树分析一下)。
其次,设s[]数组储存了某节点孩子数。
当x,y到LCA(x,y)的距离相等时,节点数为n-s[x1]-s[y1](x1为x的LCA-1倍祖先,y1为y的LCA-1倍祖先)。
不相等时,设y为较深的节点,节点数为s[y3]-s[y2](y3是a,b两点的中点节点,y2是y3与y相连边上的子节点)。
附加AC代码
LCA倍增算法详解
|
|