Скажите, пожалуйста, можно ли еще получить документ о прохождении курса ("Графы и алгоритмы", декабрь 2020) после предоставления всех дополнительных необходимых документов? |
Оптимальные каркасы
Алгоритм Крускала
Другой жадный алгоритм для задачи об оптимальном каркасе известен как алгоритм Крускала.
В нем тоже на каждом шаге
рассматривается частичное решение. Отличие от алгоритма Прима состоит
в том, что в алгоритме Крускала частичное решение всегда представляет собой
остовный лес графа
, т.е. лес, состоящий из
всех вершин
графа
и некоторых его ребер. Вначале
не
содержит ни
одного ребра, т.е. состоит из изолированных вершин. Затем к нему
последовательно добавляются ребра, пока не будет построен каркас
графа
.
Пусть
- лес, построенный к очередному шагу. Ребро
графа, не принадлежащее
, назовем красным, если вершины этого
ребра принадлежат одной компоненте связности леса
, и зеленым,
если они принадлежат разным компонентам. Если к
добавить
красное
ребро, то образуется цикл. Если же к
добавить зеленое ребро, то
получится новый лес, в котором будет на одну компоненту связности меньше,
чем в
, так как в результате добавления ребра две компоненты
сольются в одну. Таким образом, к
нельзя добавить никакое
красное ребро и можно добавить любое зеленое. Для выбора добавляемого
ребра применяется тот же "жадный" принцип, что и в алгоритме Прима
-
из всех зеленых ребер выбирается ребро наименьшего веса. Для того чтобы
облегчить поиск этого ребра, вначале все ребра графа упорядочиваются по
возрастанию весов:
.
Теперь последовательность ребер
достаточно просмотреть один раз и для очередного рассматриваемого ребра
нужно только уметь определять, является ли оно красным или зеленым
относительно построенного к этому моменту леса
. Красные ребра
просто пропускаются, а зеленые добавляются к
.
Для более формального описания алгоритма заметим, что текущий
лес
определяет разбиение множества вершин графа на области связности этого
леса:
и что красное
ребро - это такое ребро, у которого обе вершины принадлежат одной части
разбиения. Пусть
- функция, возвращающая для
каждой
вершины
имя той части разбиения, которой
принадлежит
,
а
- процедура, которая по именам
и
двух
частей разбиения строит новое разбиение, заменяя эти две части их
объединением. Пусть
,
.
Тогда алгоритм Крускала (после упомянутого упорядочения ребер) можно
записать следующим образом.
Алгоритм 2. Построение оптимального каркаса методом Крускала
-
for
to
do
-
if
then
,
Более подробно алгоритм Крускала рассматривается во второй части (в разделе, посвященном разделенным множествам). Корректность этого алгоритма следует из общей теоремы Радо-Эдмондса, которая будет рассмотрена в "следующей лекции" .