【问题标题】:Lowest Common Ancestor (boost graph)最低共同祖先(升压图)
【发布时间】:2011-05-03 19:34:33
【问题描述】:

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

如果没有,我将不胜感激有关执行此操作的最佳方法的建议。 Wikipedia claims 有有效的算法可以在 O(1) 时间内实现这一点(使用 O(n) 预处理),但它没有描述算法。

【问题讨论】:

  • 是的,我的意思是在一棵树上。很抱歉造成混乱。

标签: c++ boost graph


【解决方案1】:

在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 + ".";

【讨论】:

    【解决方案2】:

    我发现以下网站可以回答您的问题: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Lowest%20Common%20Ancestor%20%28LCA%29

    基本思想是将“最低共同祖先”问题转换为另一个问题“范围最小查询”,然后使用 O(N)+O(1) 的方法解决问题。我还没有彻底研究它,但它似乎有据可查,值得一看。

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多