边分治
边分治是类似点分治的一种树分治方法。顾名思义,边分治就是用边来分治。我们每次找的边也就是两边 size 最大值尽量小的边。同样的,边分治的过程也是把树分成了很多联通块,只是对边打标记罢了。
但是,直接边分复杂度是假的,可以参考菊花图直接卡成 O(n2) 。我们可以对所有儿子分别建立一个虚点,从上一个儿子的虚点向下一个儿子的虚点连 0 边。这样做后会发现所有点的度数都变成了 3 ,所以称之为三度化。
三度化后边分治的过程中的时间复杂度分析大概是 T(n)=O(n)+T(13n)+T(23n) 这个东西,最后也是 O(nlogn) 。
边分治的优势在于每次分治只有两个子树,自然不需要像点分那样考虑容斥或者合并子树之类的增加常数,而且也更好写。但是其劣势也很明显,如果条件没办法三度化这个东西显然就做不了了。
下面是边分版本的点分治模版。
cpp
1 |
|