![算法训练营:海量图解+竞赛刷题(进阶篇)](https://wfqqreader-1252317822.image.myqcloud.com/cover/239/47379239/b_47379239.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2 最近公共祖先LCA
最近公共祖先(Lowest Common Ancestors,LCA)指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-55-1.jpg?sign=1739361979-MLrMnJ3Fy8E1KSan4qL5K939hmczek8F-0-8fc8d458f2c173f2bde714458b9edc9c)
u和v的公共祖先指一个节点既是u的祖先,又是v的祖先。u和v的最近公共祖先指距离u和v最近的公共祖先。若v是u的祖先,则u和v的最近公共祖先是v。
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-55-2.jpg?sign=1739361979-oVoflgpHtUrUYezG9xmwL0bStgScwjIF-0-e942c9adbfa984d8a10a68ca17697b22)
可以使用LCA求解树上任意两点之间的距离。求u和v之间的距离时,若u和v的最近公共祖先为lca,则u和v之间的距离为u到树根的距离加上v到树根的距离减去2倍的lca到树根的距离:dist[u]+dist[v]-2×dist[lca]。
![](https://epubservercos.yuewen.com/B221B0/26763902601483406/epubprivate/OEBPS/Images/40886-00-56-1.jpg?sign=1739361979-7B6axPHTo2FwHrga2aaLPtj3aspKiubx-0-9863d16a03126451d132e48098da92b8)
求解LCA的方法有很多,包括暴力搜索法、树上倍增法、在线RMQ算法、离线Tarjan算法和树链剖分。
在线算法:以序列化方式一个一个地处理输入,也就是说,在开始时并不需要知道所有输入,在解决一个问题后立即输出结果。
离线算法:在开始时已知问题的所有输入数据,可以一次性回答所有问题。