Самый низкий общий предок (график повышения) - PullRequest
4 голосов
/ 02 ноября 2010

Есть ли встроенный метод в boost, чтобы найти наименьшего общего предка двух или более узлов в дереве (который является экземпляром boost :: graph)?

Если нет, я был бы признателен за предложения о том, как лучше всего это сделать. Википедия утверждает, что существует эффективный алгоритм для достижения этого за O (1) время (с предварительной обработкой O (n)), но он не описывает алгоритмы.

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Нашел алгоритм в Википедии :

 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 голос
/ 02 ноября 2010

Я нашел следующий сайт, который может ответить на ваш вопрос: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Lowest%20Common%20Ancestor%20%28LCA%29

Основная идея состоит в том, чтобы преобразовать вопрос "Самый низкий общий предок" в другой, "Запрос минимального диапазона", а затем использовать подход O (N) + O (1) для решения проблемы. Я не изучил это полностью, но это кажется довольно хорошо задокументированным и стоит посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...