LCA知识补充及相关习题
知识补充
在求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