点分治
点分治
点分治,也叫重心剖分,是一种用于树形数据结构的分治思想的算法,解决树上满足条件的路径统计问题。点分治的核心思想是通过选择树的重心结点,将树划分为若干子树,然后递归地在这些子树上应用相同的策略,从而有效地解决问题。
实现步骤
- 确定当前树的中心,设为根结点,开始点分治算法;
- 枚举下一个结点,通过 dfs 更新子树贡献;
- 清空当前使用的统计答案的数据结构,比如数组或树状数组(不建议完全清零,可能复杂度退化),删除当前结点;
- 递归处理各个子树,回到步骤 。
因为每一次选的是重心,所以每一个划分的子树大小不超过 ,所以递归的深度为 ,每一层递归中需要 的时间复杂度来处理当前树。即跑点分治实现的时间复杂度为 (不包含实现的数据结构的时间复杂度)。