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