EduBrick

Остовное дерево и лемма о безопасном ребре

Одна лемма, из которой следуют сразу три алгоритма. Доказательство обменом рёбер в цикле.

3 мин

Остов графа — подмножество рёбер, сохраняющее связность. Остовное дерево — остов, являющийся деревом: n1n-1 ребро и никаких циклов.

Задача о минимальном остовном дереве (МОД, minimum spanning tree): выбрать остовное дерево наименьшего суммарного веса.

Лишнее ребро всегда можно выбросить: если рёбер больше n1n-1, есть цикл, а ребро цикла не нужно для связности. При неотрицательных весах выбрасывание только улучшает ответ — поэтому оптимум и оказывается деревом.

Если граф несвязен, минимального остовного дерева нет вовсе; тогда обычно ищут минимальный остовный лес — по дереву в каждой компоненте.

Лемма о безопасном ребре

Назовём подграф безопасным, если его можно достроить до какого-нибудь минимального остовного дерева.

Пусть подграф безопасен. Возьмём любую его компоненту связности и среди рёбер, выходящих из неё наружу, — ребро минимального веса. Тогда подграф с добавленным ребром тоже безопасен.

Именно эта лемма и делает жадность законной: раз безопасность сохраняется на каждом шаге, то, дойдя до дерева, мы получим минимальное.

Доказательство

Пусть FF — безопасный подграф, CC — одна из его компонент, ee — минимальное ребро, выходящее из CC.

По условию FF достраивается до некоторого минимального остовного дерева TT. Если eTe \in T, доказывать нечего. Пусть eTe \notin T.

Добавим ee к TT. Появится ровно один цикл — тот, что проходит по ee и по пути между его концами в TT.

Один конец ee лежит в CC, другой — нет. Значит, путь в цикле где-то пересекает границу CC: найдётся ребро fTf \in T, у которого один конец в CC, а другой снаружи.

Ребро ff тоже выходит из CC, а ee было минимальным среди таких. Поэтому w(e)w(f)w(e) \le w(f).

Заменим: T=Tf+eT' = T - f + e. Цикл разорван, связность сохранена — снова остовное дерево. Его вес не больше веса TT, а TT минимально, значит, веса равны и TT' тоже минимально.

При этом TT' содержит и FF, и ee. То есть F+eF + e достраивается до минимального остовного дерева. \blacksquare

Три алгоритма из одной леммы

Все три просто по-разному выбирают, какую компоненту рассматривать следующей.

алгоритм какую компоненту берёт сложность
Прим всегда одну и ту же, растущую O(n2)O(n^2) или O(mlogn)O(m \log n)
Краскал ту, откуда выходит глобально минимальное ребро O(mlogm)O(m \log m)
Борувка все сразу, за одну итерацию O(mlogn)O(m \log n)

Проверено: на 40 000 случайных графов все три дали тот же вес, что и перебор всех остовных подмножеств рёбер.

Оговорки

Минимальное дерево не единственно. Если веса повторяются, деревьев может быть много, но вес у всех одинаков. Все три алгоритма найдут какое-то одно — какое именно, зависит от порядка обхода.

При попарно различных весах дерево единственно. Это следствие той же леммы: на каждом шаге минимальное выходящее ребро определено однозначно.

Отрицательные веса не мешают. Лемма нигде не использует знак. Мешают они только рассуждению «лишнее ребро выгодно выбросить»: при отрицательных весах оптимальный по весу связный подграф деревом быть не обязан. Но задача обычно формулируется именно про дерево, и тогда всё в порядке.

Максимальное остовное дерево ищется теми же алгоритмами с обратным знаком.