最低共同祖先(增强图)

时间:2010-11-02 08:06:05

标签: c++ boost graph

在boost中是否有内置方法来查找树中两个或更多节点的最低共同祖先(这是一个boost :: graph实例)?

如果没有,我会很感激有关最佳方法的建议。 Wikipedia claims有一种有效的算法可以在O(1)时间内完成此任务(使用O(n)预处理),但它没有描述算法。

2 个答案:

答案 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)方法来解决问题。我没有彻底调查过,但它似乎有很好的记录,值得一看。