Uploaded by Artem Bobrov

Жадные алгоритмы

advertisement
Студент: Бобров Артём
Группа: SE
Дата:
21 ноября 2019 г.
Жадные алгоритмы
Задача 1. Дан неориентированный граф с весами на вершинах, в котором в начальный момент нет ребер. Нужно online обрабатывать следующие запросы:
• соединить ребром пару вершин.
• по вершине узнать размер связной компоненты, которой вершина принадлежит, и
самую легкую вершину в этой компоненте.
Амортизированное время на запрос —
(log∗ V).
Решение. Дан V. Будем хранить каждую вершину, как непересекающее множество с 1 элементом. В
каждом элементе доп. информация – размер непересекающего множества и самый легкий вес(изначальной
свой же вес).
(1) При соединении ребром пару вершин. Ищем представителей 2-х вершин за O(log∗ (|V|)). Если
они совпадают, то у нас вершины находятся в одной компоненте связности, иначе - в разных.
Если они не совпадают, то мы объединяем этих 2 множества, также записываем в представителя общего множества сумму значений количества вершин в множествах и сравниваем веса
и записываем самую легкую вершину за O(1).
(2) Просто найти представителя множества и берем оттуда самую легкую вершину.
То есть в каждом представителе непересекающего множества хранится актуальная информация о
количестве элементов в компоненте и самой легкой вершине в компоненте.
Задача 2. Дан взвешенный неориентированный граф и m запросов вида «по паре вершин и
числу x узнать, существует ли между ними путь, проходящий только по ребрам не тяжелее
x». Нужно ответить на все запросы offline за время (E log V + m log m + m log∗ V).
Решение. Отсортируем ребра по неубыванию весов за O(E ∗ log(E)) = O(E ∗ log(V)). Отсортируем
запросы неубыванию x за O(m ∗ log(m)).
Заведем 2 итератора один на массиве запросов, один на массиве ребер. Изначально каждая вершина
– непересекающееся множество. При рассмотрении каждого запроса будем добавлять ребра в граф, у
которых вес меньше или равен текущему значению x. То есть объединять множества, к которым принадлежат концы ребер. Таким образом, если вершины в одной компоненте(в одном неперекающемся
множестве), то между ними есть путь. А так как на момент рассмотрения запроса в нашем графе есть
только вершины, у которых вес меньше или равен значению x текущего запроса, то путь, если он
существует, проходит только по ребрам, вес которых не тяжелее x.
1
Download