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

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

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Аннотация: Задача об оптимальном каркасе. Алгоритм Прима. Алгоритм Крускала.

Задача об оптимальном каркасе

Задача об оптимальном каркасе (стягивающем дереве) состоит в следующем. Дан обыкновенный граф G=(V,E) и весовая функция на множестве ребер w:V\texto R. Вес множества X\subseteq E определяется как сумма весов составляющих его ребер. Требуется в графе G найти каркас минимального веса. В этом разделе будем предполагать, что граф G связен, так что решением задачи всегда будет дерево. Для решения задачи об оптимальном каркасе известно несколько алгоритмов. Рассмотрим два из них.

Алгоритм Прима

В алгоритме Прима на каждом шаге рассматривается частичное решение задачи, представляющее собой дерево. Вначале это дерево состоит из единственной вершины, в качестве которой может быть выбрана любая вершина графа. Затем к дереву последовательно добавляются ребра и вершины, пока не получится остовное дерево, т.е. каркас. Для того чтобы из текущего дерева при добавлении нового ребра опять получилось дерево, это новое ребро должно соединять вершину дерева с вершиной, еще не принадлежащей дереву. Такие ребра будем называть подходящими относительно рассматриваемого дерева. В алгоритме Прима применяется следующее правило выбора: на каждом шаге из всех подходящих ребер выбирается ребро наименьшего веса. Это ребро вместе с одной новой вершиной добавляется к дереву. Если обозначить через U и F множества вершин и ребер строящегося дерева, то алгоритм Прима можно представить следующим образом.

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

  1. U\, :=\{ a\}, где a - произвольная вершина графа
  2. F\, :=\varnothing
  3. while U\ne V do
  4. найти ребро наименьшего веса e=(x,y) среди всех подходящих ребер
  5. F\, :=F\cup \{ e\}
  6. U\, :=U\cup \{ y\}

Докажем, что алгоритм Прима действительно находит оптимальный каркас. Дерево F назовем фрагментом, если существует такой оптимальный каркас T_{0} графа G, что F является подграфом дерева T_{0}. Иначе говоря, фрагмент - это дерево, которое можно достроить до оптимального каркаса.

Теорема 1. Если F - фрагмент, e - подходящее ребро наименьшего веса относительно F, то F\cup \{
e\} - фрагмент.

Доказательство. Пусть T_{0} - оптимальный каркас, содержащий F в качестве подграфа. Если ребро e принадлежит T_{0}, то F\cup \{e\} - подграф T_{0} и, следовательно, фрагмент. Допустим, e не принадлежит T_{0}. Если добавить ребро e к дереву T_{0}, то образуется цикл. В этом цикле есть еще хотя бы одно подходящее ребро относительно F (никакой цикл, очевидно, не может содержать единственное подходящее ребро). Пусть e' - такое ребро. Тогда подграф T'_{0}
=T_{0}-e'+e, получающийся из T_{0} удалением ребра e' и добавлением ребра e, тоже будет деревом. Так как w(e')\ge w(e), то w(T'_{0})\le w(T_{0}). Но T_{0} - оптимальный каркас, следовательно, w(T'_{0} )=w(T_{0}) и T'_{0} - тоже оптимальный каркас. Но F\cup \{ e\} является подграфом графа T'_{0} и, следовательно, фрагментом.

Дерево, состоящее из единственной вершины, очевидно, является фрагментом. Из теоремы 1 следует, что если после некоторого количества шагов алгоритма Прима дерево F является фрагментом, то оно будет фрагментом и после следующего шага. Следовательно, и окончательное решение, полученное алгоритмом, будет фрагментом, т.е. оптимальным каркасом.

< Лекция 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(...)

}

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

 

 

Дмитрий Крюков
Дмитрий Крюков
Россия, Москва
Андрей Посохов
Андрей Посохов
Россия, Санкт-Петербург