Изменения

Перейти к: навигация, поиск

Сведение задачи LCA к задаче RMQ

204 байта убрано, 00:38, 31 мая 2012
Нет описания правки
=== Запрос ===
Обозначим <tex>I[u]</tex> {{---}} функция, возвращающая любой индекс ячейки в списке глубин <tex>depth</tex>, в котором хранится глубина узла <tex>u</tex>. Ее можно строить во время обхода в глубину.
Пусть имеется запрос пара узлов <tex>u, v.</tex> В результате обхода в глубину получился список глубин вершин, в котором наименьшему общему предку вершин <tex>u, v</tex> соответствует минимальная глубина на отрезке <tex>depth[I[u], I[v]]. </tex> Для определённости <tex>I[u] \le I[v].</tex>
=== Доказательство корректности алгоритма ===
Наименьшему общему предку вершин <tex>u, v</tex> соответствует минимальная глубина на отрезке <tex>depth[I[u], I[v]]</tex>.
|proof=
Рассмотрим два узла <tex>u, v</tex> корневого дерева <tex>T</tex>. Для определенности считаем, что <tex>u</tex> является первой при поиске в глубину. Рассмотрим отрезок <tex>depth[I[u]..I[v]]</tex>. Поскольку этот отрезок {{---}} путь из <tex>u</tex> в <tex>v</tex>, он проходит через их наименьшего общего предка <tex>w</tex>(в дереве есть только один простой путь между вершинами). Покажем, что его глубина минимальна на отрезке <tex>depth[I[u]..I[v]]</tex>. Допустим обратное. Все потомки <tex>w</tex> имеют глубину больше. Но тогда получим, что поиск в глубину вышел из поддерева вершины <tex>w</tex> раньше, чем посетил вершину <tex>v</tex>.
}}
Анонимный участник

Навигация