Изменения

Перейти к: навигация, поиск
Нет описания правки
Дано дерево и набор запросов: пары вершин <tex>\langle v, u \rangle </tex>, и для каждой пары нужно найти наименьшего общего предка. Запросы нам известны заранее, т.е задача сформулирована в режиме оффлайн.
Алгоритм позволяет найти ответы для дерева из <tex>n</tex> вершин и <tex>m</tex> запросов за время <tex>O (n + m)</tex>, т.е при достаточно большом <tex>m</tex>, за <tex>O (1)</tex> на запрос.
=== Алгоритм ===
Подвесим наше дерево за любую вершину, и запустим [[Обход в глубину, цвета вершин|обход в глубину]] из её.
Ответ на каждый запрос мы найдём в течение поиска в глубину. Ответ для вершин <tex>v</tex>, <tex>u</tex> находится, когда мы уже посетили вершину <tex>u</tex>, а так же посетили всех сыновей вершины <tex>v</tex>, и собираемся выйти из неё.
запомнить, что ответ для запроса (v,u) = ancestor[dsu_get(q[v][i])]
=== Оценка сложности ===
Она состоит из нескольких оценок.
В-третьих, для каждого запроса проверка условия и определение результата, опять же, для всех разумных <tex>n</tex> выполняется за <tex>O (1)</tex>. Итоговая асимптотика получается <tex>O (n + m)</tex>, но при достаточно больших <tex>m</tex> ответ за <tex>O (1)</tex> на один запрос.
=== Источники ===
* [http://e-maxx.ru/algo/lca_linear_offline e-maxx.ru - алгоритмы]
* [http://habrahabr.ru/post/104772 habrahabr - Система непересекающихся множеств и её применения]
Анонимный участник

Навигация