知识补充
在求lca的时候,除了常规的倍增、RMQ、树剖以外,还有一种改良的倍增算法,效率是原来的一倍。
具体步骤是在dfs预处理倍增数组的时候同时维护两个时间戳(Tin)和(Tout),分别代表dfs时进入该子树和离开该子树的时刻。
这样如果点(u)是点(v)的祖先,必然满足(Tin(u) < Tin(v), Tout(v) < Tout(u))。所以我们可以(O(1))判断两个点的祖先关系。
基于这个思想,求(x)和(y)的lca,我们只用判断当前深度小的点往上跳(2 ^k)步后是否为(y)的祖先,如果不是就跳。这样最后(x)的父亲节点就是lca了。
时间复杂度虽然是(O(nlogn)),但是实际运行时间不到原来算法的(frac{1}{2})。
接下来说一些有意思的习题。
POJ3417 Network