Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3533 / 125 | Оценка: 4.44 / 4.11 | Длительность: 13:45:00
Специальности: Программист, Математик
Лекция 13:

Оптимальные каркасы

< Лекция 12 || Лекция 13: 123 || Лекция 14 >

Алгоритм Крускала

Другой жадный алгоритм для задачи об оптимальном каркасе известен как алгоритм Крускала. В нем тоже на каждом шаге рассматривается частичное решение. Отличие от алгоритма Прима состоит в том, что в алгоритме Крускала частичное решение всегда представляет собой остовный лес F графа G, т.е. лес, состоящий из всех вершин графа G и некоторых его ребер. Вначале F не содержит ни одного ребра, т.е. состоит из изолированных вершин. Затем к нему последовательно добавляются ребра, пока не будет построен каркас графа G. Пусть F - лес, построенный к очередному шагу. Ребро графа, не принадлежащее F, назовем красным, если вершины этого ребра принадлежат одной компоненте связности леса F, и зеленым, если они принадлежат разным компонентам. Если к F добавить красное ребро, то образуется цикл. Если же к F добавить зеленое ребро, то получится новый лес, в котором будет на одну компоненту связности меньше, чем в F, так как в результате добавления ребра две компоненты сольются в одну. Таким образом, к F нельзя добавить никакое красное ребро и можно добавить любое зеленое. Для выбора добавляемого ребра применяется тот же "жадный" принцип, что и в алгоритме Прима - из всех зеленых ребер выбирается ребро наименьшего веса. Для того чтобы облегчить поиск этого ребра, вначале все ребра графа упорядочиваются по возрастанию весов: w(e_{1} )\le w(e_{2} )\le \ldots \le w(e_{m}). Теперь последовательность ребер e_{1},e_{2} \ldots e_{m} достаточно просмотреть один раз и для очередного рассматриваемого ребра нужно только уметь определять, является ли оно красным или зеленым относительно построенного к этому моменту леса F. Красные ребра просто пропускаются, а зеленые добавляются к F.

Для более формального описания алгоритма заметим, что текущий лес F определяет разбиение множества вершин графа на области связности этого леса: V=P_{1} \cup P_{2} \cup \ldots \cup P_{k} и что красное ребро - это такое ребро, у которого обе вершины принадлежат одной части разбиения. Пусть \Part(x) - функция, возвращающая для каждой вершины x имя той части разбиения, которой принадлежит x, а \Unite(x,y) - процедура, которая по именам x и y двух частей разбиения строит новое разбиение, заменяя эти две части их объединением. Пусть e_{i} =(a_{i},b_{i}), i=1\ldots
m. Тогда алгоритм Крускала (после упомянутого упорядочения ребер) можно записать следующим образом.

Алгоритм 2. Построение оптимального каркаса методом Крускала

  1. for i:=1 to m do
  2. x:=\Part(a_{i})
  3. y:=\Part(b_{i})
  4. if x\ne y then {F:=F\cup \{ e_{i}}, \Unite(x,y)}

Более подробно алгоритм Крускала рассматривается во второй части (в разделе, посвященном разделенным множествам). Корректность этого алгоритма следует из общей теоремы Радо-Эдмондса, которая будет рассмотрена в "следующей лекции" .

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Петр Петров
Петр Петров

произведение графов К(2)*О(4) фактически 4 отдельных графа К(2)?

Александр Лаврентьев
Александр Лаврентьев

много инструкций вида if - then - else

Например Procedure DFS(a) опишите каким образом следует понимать вложенность инструкций. Как в языке С ? 

т.е. следующее 

if (...) then (...)

if (...) then (...)

else(...)

 

раскрывается как 

if (...) then (...)

if (...) then (...)

         else(...)

или так :

if (...) then

 {  (...)

     if (...) then (...)

              else(...)

}

обьясните пожалуйста.

 

 

Константин Дементьев
Константин Дементьев
Россия, г. Мичуринск