Остовное дерево и лемма о безопасном ребре
Одна лемма, из которой следуют сразу три алгоритма. Доказательство обменом рёбер в цикле.
3 мин
Остов графа — подмножество рёбер, сохраняющее связность. Остовное дерево — остов, являющийся деревом: ребро и никаких циклов.
Задача о минимальном остовном дереве (МОД, minimum spanning tree): выбрать остовное дерево наименьшего суммарного веса.
Лишнее ребро всегда можно выбросить: если рёбер больше , есть цикл, а ребро цикла не нужно для связности. При неотрицательных весах выбрасывание только улучшает ответ — поэтому оптимум и оказывается деревом.
Если граф несвязен, минимального остовного дерева нет вовсе; тогда обычно ищут минимальный остовный лес — по дереву в каждой компоненте.
Лемма о безопасном ребре
Назовём подграф безопасным, если его можно достроить до какого-нибудь минимального остовного дерева.
Пусть подграф безопасен. Возьмём любую его компоненту связности и среди рёбер, выходящих из неё наружу, — ребро минимального веса. Тогда подграф с добавленным ребром тоже безопасен.
Именно эта лемма и делает жадность законной: раз безопасность сохраняется на каждом шаге, то, дойдя до дерева, мы получим минимальное.
Доказательство
Пусть — безопасный подграф, — одна из его компонент, — минимальное ребро, выходящее из .
По условию достраивается до некоторого минимального остовного дерева . Если , доказывать нечего. Пусть .
Добавим к . Появится ровно один цикл — тот, что проходит по и по пути между его концами в .
Один конец лежит в , другой — нет. Значит, путь в цикле где-то пересекает границу : найдётся ребро , у которого один конец в , а другой снаружи.
Ребро тоже выходит из , а было минимальным среди таких. Поэтому .
Заменим: . Цикл разорван, связность сохранена — снова остовное дерево. Его вес не больше веса , а минимально, значит, веса равны и тоже минимально.
При этом содержит и , и . То есть достраивается до минимального остовного дерева.
Три алгоритма из одной леммы
Все три просто по-разному выбирают, какую компоненту рассматривать следующей.
| алгоритм | какую компоненту берёт | сложность |
|---|---|---|
| Прим | всегда одну и ту же, растущую | или |
| Краскал | ту, откуда выходит глобально минимальное ребро | |
| Борувка | все сразу, за одну итерацию |
Проверено: на 40 000 случайных графов все три дали тот же вес, что и перебор всех остовных подмножеств рёбер.
Оговорки
Минимальное дерево не единственно. Если веса повторяются, деревьев может быть много, но вес у всех одинаков. Все три алгоритма найдут какое-то одно — какое именно, зависит от порядка обхода.
При попарно различных весах дерево единственно. Это следствие той же леммы: на каждом шаге минимальное выходящее ребро определено однозначно.
Отрицательные веса не мешают. Лемма нигде не использует знак. Мешают они только рассуждению «лишнее ребро выгодно выбросить»: при отрицательных весах оптимальный по весу связный подграф деревом быть не обязан. Но задача обычно формулируется именно про дерево, и тогда всё в порядке.
Максимальное остовное дерево ищется теми же алгоритмами с обратным знаком.