# теория · шаг 1 из 6
Свойство разреза: одна теорема на все алгоритмы
Коротко
Остовное дерево - подмножество рёбер, которое связывает все вершины и не содержит циклов; в нём
всегда ровно V − 1 ребро. Минимальное остовное дерево (МОД) - то, у которого суммарный вес
наименьший: самая дешёвая сеть, связывающая всё. Почти все алгоритмы его построения - следствие
одной теоремы. Свойство разреза: если разбить вершины на две непустые части, то САМОЕ ЛЁГКОЕ
ребро между частями входит в минимальное остовное дерево. Доказывается обменом: если бы его там не
было, добавим его к дереву, получим цикл, выбросим из цикла другое ребро, пересекающее разрез, - и
дерево станет не тяжелее. Прим и Крускал отличаются лишь тем, какой разрез они рассматривают.
Если ты умеешь доказать свойство разреза обменным аргументом, знаешь свойство цикла и понимаешь, почему из них следуют оба алгоритма, листай до «Теперь сам».
Как думаешь, какое ребро точно войдёт
Надо соединить V городов дорогами так, чтобы можно было доехать откуда угодно куда угодно, а
суммарная длина дорог была наименьшей. Прежде чем читать дальше, ответь на вопрос поменьше: про
КАКОЕ-НИБУДЬ ребро можно ли сказать наверняка, что оно войдёт в ответ? Подсказка: посмотри на самое
лёгкое ребро при какой-нибудь вершине.
На что это похоже
Острова и мосты. Раздели архипелаг на две группы островов - как угодно. Между группами должен быть хотя бы один мост, иначе они не связаны. Если мостов между ними несколько, самый дешёвый из них взять выгоднее: любой набор мостов можно «обменять» на него, не потеряв связности и не переплатив.
Механизм: остов, разрез и две теоремы
остовное дерево - связный подграф без циклов, содержит все вершины, ровно V − 1 ребро
МОД - остовное дерево наименьшего суммарного веса
разрез (S, V∖S) - разбиение вершин на две непустые части
(V - МНОЖЕСТВО вершин, знак ∖ читается «без»:
V∖S - все вершины, кроме попавших в S)
ребро пересекает разрез, если его концы лежат в разных частях
Свойство разреза. Для любого разреза самое лёгкое пересекающее его ребро входит в некоторое минимальное остовное дерево. Если веса всех рёбер различны, оно входит в ЕДИНСТВЕННОЕ МОД - и само МОД единственно.
Свойство цикла. В любом цикле самое ТЯЖЁЛОЕ ребро не входит ни в одно МОД (если оно единственное самое тяжёлое). Это зеркальное утверждение, и из него растут алгоритмы «удаления»: выбрасывай самое тяжёлое ребро каждого цикла, пока не останется дерево.
a, b, c, справа d и e, пунктир показывает границу. Рёбра внутри частей разрез не пересекают и в этом рассуждении не участвуют; пересекают его три ребра - весами 7, 3 и 9. Самое лёгкое из них, весом 3, обязательно входит в минимальное остовное дерево - это и есть свойство разреза.Правило
Остовное дерево связывает все вершины и содержит ровно V − 1 ребро; минимальное - то, у
которого суммарный вес наименьший. СВОЙСТВО РАЗРЕЗА: для любого разбиения вершин на две непустые
части самое лёгкое ребро между частями входит в некоторое МОД (а при различных весах - в
единственное). СВОЙСТВО ЦИКЛА: самое тяжёлое ребро любого цикла не входит ни в одно МОД. Алгоритмы
Прима и Крускала - это два разных способа выбирать разрезы, и корректность обоих следует из первой
теоремы.
Разбор: доказательство обменом
Пусть дан разрез (S, V∖S) и пусть e - самое лёгкое ребро, его пересекающее. Докажем, что e
входит в некоторое минимальное остовное дерево.
Возьмём любое МОД T. Если e уже в нём - доказывать нечего. Пусть e не в T. Добавим e к
T: в дереве появится ровно один цикл (добавление ребра к дереву всегда даёт один цикл - между
концами e уже был единственный путь, и теперь он замкнулся).
Этот цикл выходит из S и возвращается обратно, значит он пересекает разрез ЧЁТНОЕ число раз - и
кроме e в нём есть ещё хотя бы одно ребро f, пересекающее разрез. Выбросим f:
T' = T + e − f
Что получилось? Число рёбер прежнее (V − 1), циклов нет (мы разорвали единственный появившийся),
связность цела (удалённое ребро лежало на цикле, значит его концы соединены обходным путём). Значит
T' - остовное дерево. Его вес: w(T') = w(T) + w(e) − w(f). Но e - САМОЕ ЛЁГКОЕ среди
пересекающих разрез, значит w(e) <= w(f), откуда w(T') <= w(T).
Дерево T было минимальным, значит w(T') = w(T), и T' - тоже МОД, причём содержащий e. Что
и требовалось. А если веса различны, то w(e) < w(f) строго, и w(T') < w(T) - противоречие с
минимальностью T: значит e входит в КАЖДОЕ минимальное остовное дерево, и оно единственно.
Обменный аргумент - приём, который стоит запомнить отдельно: «возьмём оптимум, подменим в нём одну деталь на нашу и покажем, что хуже не стало». Так доказывают корректность огромного числа жадных алгоритмов.
Разбор: как из одной теоремы получаются два алгоритма
Оба алгоритма только и делают, что применяют свойство разреза - к разным разрезам.
Прим. Держим растущее дерево S (сначала одна вершина). Разрез - это «уже в дереве» против
«ещё нет». Берём самое лёгкое ребро, пересекающее ЭТОТ разрез, добавляем, вершина переходит в S.
По свойству разреза добавленное ребро принадлежит МОД, значит после V − 1 шага получится МОД
целиком.
Крускал. Перебираем рёбра по возрастанию веса и берём ребро, если его концы ещё не связаны. Разрез здесь такой: компонента, содержащая один конец ребра, против всего остального. Раз все более лёгкие рёбра уже рассмотрены и либо взяты, либо соединяли связанное, то наше ребро - самое лёгкое из пересекающих этот разрез. Снова свойство разреза, снова ребро принадлежит МОД.
Борувка. Каждая компонента одновременно выбирает своё самое лёгкое исходящее ребро - это V
разрезов сразу, и все выборы законны по той же теореме.
Один результат, три стратегии выбора разреза. Именно поэтому в этой главе доказывается ОДНА теорема, а алгоритмы после неё разбираются почти без доказательств.
Что ломается без этого
Первое: считать, что МОД минимизирует расстояния между вершинами - нет, он минимизирует СУММАРНЫЙ вес рёбер; путь между двумя вершинами в МОД может быть заметно длиннее кратчайшего в графе. Второе: искать МОД в ориентированном графе - там это другая задача (оптимальное ветвление, алгоритм Эдмондса), и привычные алгоритмы не работают. Третье: забывать про связность: у несвязного графа остовного дерева нет, есть остовный ЛЕС - по дереву на компоненту. Четвёртое: полагать, что МОД единственно всегда - при равных весах их может быть много (у квадрата с равными сторонами их четыре). Пятое: применять свойство цикла «на глаз», забыв про условие единственности самого тяжёлого ребра: если в цикле два ребра максимального веса, какое-то из них может войти в МОД.
Зачем это в работе
Минимальное остовное дерево - это «связать всё как можно дешевле»: прокладка сетей (кабель,
водопровод, электричество), проектирование связей между дата-центрами, построение деревьев
рассылки. Но применений куда больше, чем очевидных: кластеризация (выбросив из МОД k − 1 самых
тяжёлых рёбер, получаем k кластеров - это алгоритм одиночной связи), приближённые решения задачи
коммивояжёра (обход МОД даёт маршрут не хуже двукратного оптимума), анализ изображений и
сегментация, построение скелетов сетей в биоинформатике. А обменный аргумент из доказательства -
универсальный инструмент: им же доказывают корректность жадных алгоритмов для расписаний,
рюкзачных задач с дробными предметами и кодов Хаффмана.
Теперь сам
Граф: a-b = 4, a-c = 1, b-c = 2, b-d = 5, c-d = 3. Примени свойство разреза к разбиению
{a, c} против {b, d} и скажи, какое ребро точно войдёт в МОД. Потом найди само МОД и проверь.
Ответ. Какие рёбра пересекают разрез {a, c} | {b, d}? Это a-b (вес 4), b-c (вес 2) и
c-d (вес 3). Ребро a-c целиком внутри левой части, b-d - внутри правой, они разрез не
пересекают. Самое лёгкое из пересекающих - b-c весом 2, значит оно входит в МОД (веса
различны, значит в единственное).
Теперь построим МОД целиком, например Крускалом: сортируем рёбра - a-c (1), b-c (2), c-d (3),
a-b (4), b-d (5). Берём a-c (1) - концы не связаны, берём. Берём b-c (2) - не связаны,
берём. Берём c-d (3) - не связаны, берём. Теперь в дереве три ребра при четырёх вершинах -
V − 1 = 3, готово. МОД = {a-c, b-c, c-d}, вес 1 + 2 + 3 = 6. Ребро b-c действительно
вошло, как и обещала теорема.
Проверим заодно свойство цикла: в графе есть цикл a-b-c-a с весами 4, 2, 1 - самое тяжёлое ребро
a-b (4), и его в МОД нет ✓. И цикл b-c-d-b с весами 2, 3, 5 - самое тяжёлое b-d (5), его в
МОД тоже нет ✓.
Главное
Остовное дерево связывает все вершины без циклов и содержит ровно V − 1 ребро; минимальное -
самое лёгкое по суммарному весу. Вся глава держится на СВОЙСТВЕ РАЗРЕЗА: для любого разбиения
вершин на две непустые части самое лёгкое ребро между частями входит в некоторое МОД, а при
различных весах - в единственное, и тогда само МОД единственно. Доказательство - обменный
аргумент: добавили ребро к оптимальному дереву, получили ровно один цикл, выбросили из него другое
ребро, пересекающее разрез, и вес не вырос. Зеркальное СВОЙСТВО ЦИКЛА говорит, что самое тяжёлое
ребро любого цикла в МОД не входит. Из свойства разреза выводятся все алгоритмы главы - они
отличаются лишь тем, какой разрез рассматривают: Прим - «дерево против остального», Крускал -
«компонента против остального», Борувка - все компоненты сразу. Важные оговорки: МОД не
минимизирует расстояния между парами вершин, в ориентированном графе это другая задача, а у
несвязного графа есть только остовный лес.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий