Тема: Дерево.
Как можно отвечать на запрос длины минимального пути в дереве из вершини А к вершине В? Сложность ответа не более Log N.
Спасибо.
P.S. Само N <= 100000;
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
MAXimal :: φορυμ » Algo » Дерево.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как можно отвечать на запрос длины минимального пути в дереве из вершини А к вершине В? Сложность ответа не более Log N.
Спасибо.
P.S. Само N <= 100000;
Найти наименьшего общего предка - см. LCA. А дальше задача сводится к длине пути от одной вершины до какого-то её предка,и это уже гораздо более простая задача. Проще всего считать эту длину на ходу,по ходу нахождения наименьшего нашего предка, для чего удобно применить алгоритм двоичного подъема, описанный на этом сайте.
Выделим какую-то вершину root как корень. Посчитаем расстояние от корня до всех остальных вершин.
Тогда, если поступает запрос нахождения кратчайшего пути между A и B, то пусть C - их наименьший общий предок. Легко показать, что dist(A,B)=dist(root,A)+dist(root,B)-2*dist(root,C). На этом сайте описано, как быстро находить LCA. Если использовать эффективный алгоритм, то тут можно получить сложность даже O(N+M), где N - кол-во вершин, а M - кол-во запросов.
Edit: пока писал, уже ответили.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
MAXimal :: φορυμ » Algo » Дерево.