Задача о динамической связности — различия между версиями
(→remove(u,v)) |
(→remove(u,v)) |
||
Строка 61: | Строка 61: | ||
}} | }} | ||
− | Чтобы найти <tex>xy</tex>, выберем из поддеревьев <tex>T_u</tex> и <tex>T_v</tex> наименьшее. Не умаляя общности, будем считать, что <tex>|T(u)|\leqslant|T_v|</tex>. <!--ежу понятно--> Так как хотя бы одно из двух слагаемых всегда не превосходит половины их суммы, имеем важное свойство: <tex>|T(u)|\leqslant\dfrac{|T_u|+|T_v|}{2}=|T|</tex>. | + | Чтобы найти <tex>xy</tex>, выберем из поддеревьев <tex>T_u</tex> и <tex>T_v</tex> наименьшее. Не умаляя общности, будем считать, что <tex>|T(u)|\leqslant|T_v|</tex>. <!--ежу понятно--> Так как хотя бы одно из двух слагаемых всегда не превосходит половины их суммы, имеем важное свойство: <tex>|T(u)|\leqslant\dfrac{|T_u|+|T_v|}{2}=\dfrac{|T|}{2}</tex>. |
Версия 22:53, 14 января 2018
Задача: |
Есть неориентированный граф из вершин, изначально не содержащий рёбер. Требуется обработать запросов трёх типов:
|
Содержание
Динамическая связность в лесах
Если задача такова, что в графе нет и не может быть циклов, то она сводится к задаче о связности в деревьях эйлерова обхода. Время работы каждого запроса для упрощённой задачи — .
Обобщение задачи для произвольных графов
Существуют задачи, в которых граф не обязательно на протяжении нашей работы после каждой операции добавления ребра остаётся лесом. Для решения таких задач в каждой компоненте связности выделим остовные деревья, которые образуют остовный лес. Попробуем выполнить операцию удаления ребра.
connected(u,v)
Граф и его остовный лес — одно и то же с точки зрения связности. Поэтому проверка связности в графе сводится к проверке связности в остовном лесе и решается за
.add(u,v)
Чтобы разобраться с тем, как изменится граф и остовный лес при добавлении и удалении ребра, введём функцию
и назовём её уровнем ребра . Уровни ребра можно распределить любым способом, но для всех должно выполняться следующее свойство: размер каждой компоненты связности не превосходит . Здесь графы определяются так: .Очевидно, что
. Выделим в графах остовные леса таким образом, что , где — остовный лес графа .Удобнее всего новому ребру давать уровень
. В этом случае изменится только , так как в остальные подграфы рёбра нулевого уровня не входят. После вставки нового ребра нам нужно проверить, были ли вершины и в одной компоненте связности до того, как мы вставили ребро. Если они лежали в разных компонентах, то необходимо новое ребро добавить и в остовный лес .
remove(u,v)
Утверждение: |
Если ребро, которое мы хотим удалить, не принадлежит остовному лесу, то связность между любой парой вершин сохранится. |
Докажем от противного. Допустим, что это не так. Понятно, что при разрезании ребра нового пути между вершинами не появится. Предположим, что нарушилась связность для каких-то двух вершин. Значит, мы убрали мост. А любой мост принадлежит всем остовным деревьям его компоненты. Противоречие. |
Таким образом, если мы удалили ребро не из остовного леса, то нам не придётся перестраивать лес и пересчитывать значение
. Рассмотрим случаи, когда мы берём ребро из леса. Тогда необходимо выяснить, не является ли данное ребро мостом в графе, и выполнить соответствующие действия.Проверим, является ли ребро мостом. У ребра
известен уровень, пусть он равен . Попробуем найти другое ребро ( ), соединяющее поддеревья и , на которые распалось остовное дерево исследуемой компоненты .Утверждение: |
От противного. Пусть | и . Тогда вершины и каким-то образом связаны в (либо непосредственно ребром , либо каким-то другим путём). Но . Значит, в между и сохранился путь из рёбер уровня не меньше и появился другой путь через . Приходим к противоречию, так как в все компоненты должны быть деревьями.
Чтобы найти
, выберем из поддеревьев и наименьшее. Не умаляя общности, будем считать, что . Так как хотя бы одно из двух слагаемых всегда не превосходит половины их суммы, имеем важное свойство: .