LCA:即最近公共祖先。顾名思义,他是求两个点的祖宗的算法(基于有根树)。
设节点x深度为dep[x].节点y深度为dep[y].(假设dep[x]>dep[y])那么怎么找他们的最近祖宗呢?
首先让x向上走直到与y深度相同(走到的点记作x0,y向上走的点记作y0)。然后判断当前x0是否等于y。如果等于
y就是x和y的LCA。如果否,就让x和y同时向上走一步,然后判断是否x0等于y0.不断循环,直到x0等于y0就求得啦LCA。这个算法的时间复杂度是O(dep[x]+dep[y]).如果是求多个点的LCA,那么这个时间就有些长啦。
这个时候可以用二分法优化。设fa[k][x].为对于x节点向上走2^k步所到达的位置。
x和y到达LCA的距离可以用二进制表示。就用fa[k][x]向上走。思路本同上。
实现代码