在boost中是否有内置方法来查找树中两个或更多节点的最低共同祖先(这是一个boost :: graph实例)?
如果没有,我会很感激有关最佳方法的建议。 Wikipedia claims有一种有效的算法可以在O(1)时间内完成此任务(使用O(n)预处理),但它没有描述算法。
答案 0 :(得分:3)
在Wikipedia中找到算法:
function TarjanOLCA(u)
MakeSet(u);
u.ancestor := u;
for each v in u.children do
TarjanOLCA(v);
Union(u,v);
Find(u).ancestor := u;
u.colour := black;
for each v such that {u,v} in P do
if v.colour == black
print "Tarjan's Least Common Ancestor of " + u +
" and " + v + " is " + Find(v).ancestor + ".";
答案 1 :(得分:1)
我找到了以下可能回答您问题的网站: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Lowest%20Common%20Ancestor%20%28LCA%29
基本思想是将“最低共同祖先”问题转换为另一个问题“范围最小查询”,然后使用O(N)+ O(1)方法来解决问题。我没有彻底调查过,但它似乎有很好的记录,值得一看。