Студент: Бобров Артём Группа: 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