Наименьший общий предок (LCA)
Ниже представлено описание задачи, приведены ссылки на сторонние ресурсы с материалами, а также на упражнения, которые можно решить для практики по данной теме.
Задача поиска наименьшего общего предка в общем виде формулируется следующим образом:
Пусть задано дерево , подвесим его за некоторую вершину и назовём её корнем. Требуется для данных вершин и найти наиболее удалённую от корня дерева вершину, лежащую на обоих путях от и до корня.
Алгоритмы решения
Алгоритм на построение, на запрос
Описание тривиального алгоритма:
Обходом в глубину посчитаем глубину каждой вершины дерева. Напомню, что глубиной называется длина пути до вершины от корня дерева. Дальше для вершин и рассмотрим всех предков с одинаковой глубиной, из одинаковых предков возьмём ту вершину, глубина которой больше.
Очевидно, что сложность такого алгоритма на предварительные посторения (обход в глубину), и на запрос.
Алгоритм на построение, на запрос
Одним из самых простых быстрых алгоритмов нахождения LCA является «Метод двоичного подъема». Почитать описание и посмотреть примеры реализации можно здесь:
Алгоритмы на построение, или на запрос
Алгоритмы, основанные на сведении задачи LCA к задаче поиска минимума на отрезке (RMQ). Почитать подробнее можно здесь:
Алгоритм на построение, на запрос (алгоритм Фарах-Колтона и Бендера)
Задачи
Простые
Средние
- Codeforces - 832D. Миша, Гриша и метро
- Timus - 1752. Дерево 2
- SPOJ - NTICKETS
- SPOJ - QTREE2
- SPOJ - DRTREE
- SPOJ - GRASSPLA
Leave a Comment
Your email address will not be published. Required fields are marked *