Сведение задачи 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) Построим дерево отрезков по полученному массиву.