【发布时间】:2011-05-03 19:34:33
【问题描述】:
boost 中是否有内置方法来查找树中两个或多个节点的最低共同祖先(即 boost::graph 实例)?
如果没有,我将不胜感激有关执行此操作的最佳方法的建议。 Wikipedia claims 有有效的算法可以在 O(1) 时间内实现这一点(使用 O(n) 预处理),但它没有描述算法。
【问题讨论】:
-
是的,我的意思是在一棵树上。很抱歉造成混乱。
boost 中是否有内置方法来查找树中两个或多个节点的最低共同祖先(即 boost::graph 实例)?
如果没有,我将不胜感激有关执行此操作的最佳方法的建议。 Wikipedia claims 有有效的算法可以在 O(1) 时间内实现这一点(使用 O(n) 预处理),但它没有描述算法。
【问题讨论】:
在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 + ".";
【讨论】:
我发现以下网站可以回答您的问题: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Lowest%20Common%20Ancestor%20%28LCA%29
基本思想是将“最低共同祖先”问题转换为另一个问题“范围最小查询”,然后使用 O(N)+O(1) 的方法解决问题。我还没有彻底研究它,但它似乎有据可查,值得一看。
【讨论】: