Сведение задачи LCA к задаче RMQ — различия между версиями
Строка 5: | Строка 5: | ||
Пусть дано корневое дерево <tex>T.</tex> На вход подаются запросы вида <tex>(u,\;v),</tex> для каждого запроса требуется найти их наименьшего общего предка. | Пусть дано корневое дерево <tex>T.</tex> На вход подаются запросы вида <tex>(u,\;v),</tex> для каждого запроса требуется найти их наименьшего общего предка. | ||
+ | == Алгоритм == | ||
+ | === Препроцессинг === | ||
+ | 1) В каждом узле будет храниться глубина узла в корневом дереве <tex>T.</tex> | ||
+ | :<tex>depth(u)= \begin{cases} | ||
+ | 0 & u = root(T),\\ | ||
+ | depth(v) + 1 & u = son(v). | ||
+ | \end{cases}</tex> | ||
+ | |||
+ | 2) Ориентируем каждое ребро в дереве <tex>T</tex> и добавим обратное к этому ребру. Получим эйлеров граф <tex>E.</tex>. Найдем в графе <tex>E</tex> эйлеров цикл, записывая в массив глубину посещенных узлов. | ||
+ | |||
+ | 3) Построим дерево отрезков по полученному массиву. | ||
== См.также == | == См.также == |
Версия 07:25, 25 марта 2011
Постановка задачи LCA
Определение: |
Наименьший общий предок (least common ancestor) двух узлов | в корневом дереве - это такой узел который среди всех узлов, являющихся предками как узла так и имеет наибольшую глубину.
Пусть дано корневое дерево
На вход подаются запросы вида для каждого запроса требуется найти их наименьшего общего предка.Алгоритм
Препроцессинг
1) В каждом узле будет храниться глубина узла в корневом дереве
2) Ориентируем каждое ребро в дереве
и добавим обратное к этому ребру. Получим эйлеров граф . Найдем в графе эйлеров цикл, записывая в массив глубину посещенных узлов.3) Построим дерево отрезков по полученному массиву.