Изменения

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

Алгоритм Голдберга-Тарьяна

3232 байта добавлено, 15:42, 2 января 2016
Деревья
===Деревья===
Проблема в том, что дерево не путь и его нельзя так просто свести к структурам данных, в силу нелинейности индексов. Но можно дерево нарезать на пути. Рассмотрим корневое дерево, на котором хотим выполнять операции. Забудем про (link), (cut). Только первые 2 операции.
Существует подход, который позволяет сделать за log(n)^2.
Heavy-Light Decomposition.
 
Рассмотрим дерево, каждое ребро объявим легким и тяжелым по следующему критерию:
Пусть есть дерево, у него есть размер - количество вершин в поддереве. Среди всех поддеревьев дерева выберем самое большое по размеру и ребро из него объявим тяжелым. Если одинаковые - любое выберем. В каждую вершину кроме листа будет входить ровно одно тяжелое ребро из самого большого поддерева. Тогда несложно заметить.
 
Лемма. На пути от любой вершины до корня не больше log(N) легких ребер. Потому что каждый раз когда мы идем по легкому ребру, размер поддерева той вершины, в которой мы находимся, размер поддерева увеличивается хотя бы в два раза. Потому что если увеличился меньше, чем в два раза, значит здесь было больше половины потомков следующей вершины, значит это ребро было тяжелым. Значит легких ребер мало, а тяжелых много. Тяжелые ребра образуют разбиение дерева на пути. Чтобы решить наши задачи делаем так:
# Начинаем в какой-то вершине, берем тот путь к которому она принадлежит (Тот фрагмент от вершины до конца тяжелого пути)
# Делаем шаг по легкому пути
# Берем снова часть тяжелого пути
# и т.д, пока не дойдем до корня.
 
Тогда запрос на суффиксе пути будет за log(N). Каждый раз, когда меняем путь - проходим по легкому пути. Т.к по лемме их не больше log(N), то суммарное время запроса log(n)^2.
Если добавить link, cut, то тяжело поддерживать, какое ребро легкое какое тяжелое. Жд этого нужно аккуратно следить за деревьями. Потому что при подвешивании дерева, абсолютно любое ребро на пути от вершины до корня может стать легким или тяжелым. Это неудобно. Применим метод как в TANGO-деревьях.
 
Когда есть запрос для какого-то пути, мы сначала перестроим пути так, чтоб путь от вершины до корня был полностью из жирных (solid) ребер.
==Идея==
Анонимный участник

Навигация