Изменения

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

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

597 байт убрано, 00:06, 31 мая 2012
Нет описания правки
Приведенный выше алгоритм работает верно.
|proof=
Рассмотрим два узла <tex>u, v</tex> корневого дерева <tex>T</tex>. Для определенности считаем, что <tex>u</tex> является первой при поиске в глубину. На отрезке <tex>depth[I[u]..end]</tex> (<tex>end</tex> {{---}} последний элемент в <tex>depth</tex>) хранятся узлы посещенные после <tex>u</tex> и, быть может, некоторые вершины из поддерева с корнем <tex>u</tex>(которые имеют глубину больше глубины <tex>u</tex>). Аналогично на <tex>depth[1..I[v]]</tex> {{---}} вершины, посещенные до <tex>v</tex> и некоторые вершины из поддерева <tex>v</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>.
}}
Анонимный участник

Навигация