Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.docx
Скачиваний:
37
Добавлен:
06.07.2016
Размер:
27.08 Кб
Скачать

Доклад по теме «Построение остовных деревьев минимальной стоимости. Алгоритм Прима».

Выполнил Литвинов Михаил.

Кратчайший остов 

Задача отыскания кратчайшего остова графа является классической задачей теории графов. Методы решения этой задачи послужили основой для многих других важных результатов. В частности, исследования алгоритма Краскала, описанного в подразделе 9.5.3, привели в конечном счёте к теории жадных алгоритмов, изложенной в подразделе 2.6.4. 

Определения 

Пусть G(V, Е) — граф. Остовный подграф графа G(V, Е) — это подграф, содержащий все вершины. Остовный подграф, являющийся деревом, называется остовом или каркасом. 

Замечание 

• Остов определяется множеством рёбер, поскольку вершины остова суть вершины графа. 

• Несвязный граф не имеет остова. Связный граф может иметь много остовов. 

Отступление 

Если задать длины рёбер, то можно поставить задачу нахождения кратчайшего остова. Эта задача имеет множество практических интерпретаций. Например, пусть задано множество аэродромов и нужно определить минимальный (по сумме расстояний) набор авиарейсов, который позволил бы перелететь с любого аэродрома на любой другой. Решением этой задачи будет кратчайший остов полного графа расстояний между аэродромами. 

Замечание 

Существует множество различных способов найти какой-то остов графа. Например, алгоритм поиска в глубину строит остов (по рёбрам возврата). Множество кратчайших путей из заданной вершины ко всем остальным также образует остов. Однако этот остов может не быть кратчайшим. 

Пример 

На рис. показаны диаграммы (слева направо) графа, дерева кратчайших путей из вершины 1 с суммарным весом 5 и два кратчайших остова этого графа.  

Рис. Граф, дерево кратчайших путей и два кратчайших остова

Схема алгоритма построения кратчайшего остова 

Рассмотрим следующую схему алгоритма построения кратчайшего остова. Пусть Т — множество непересекающихся деревьев, являющихся подграфами графа G. Вначале Т состоит из отдельных вершин графа G, в конце Т содержит единственный элемент — кратчайший остов графа G. 

Алгоритм 9.11 Построение кратчайшего остова 

Вход: граф G(V,E), заданный матрицей длин рёбер С. 

Выход: кратчайший остов Т. 

T: = V 

while в Т больше одного элемента do 

взять любое поддерево из Т 

найти к нему ближайшее 

соединить эти деревья в Т 

end while 

Обоснование

Возьмём произвольное дерево Тi и выберем ближайшее к нему 

дерево Tj в Т, Tj ∩Ti пустое множество. Положим 

Так как с самого начала все вершины G покрыты деревьями из Т, a Tj выбирается ближайшим к Ti то всегда реализуется на некотором ребре с длиной

Далее индукцией по шагам алгоритма 9.11 покажем, что все рёбра, включенные в деревья из Т, принадлежат кратчайшему остову — SST(SST — Shortest Spanning Tree — стандартное обозначение для кратчайшего остова). Вначале выбранных рёбер нет, поэтому их множество включается в кратчайший остов. Пусть теперь все рёбра, добавленные в Т, принадлежат SST. Рассмотрим очередной шаг алгоритма. Пусть на этом шаге добавлено ребро (i,j), соединяющее поддерево Ti с поддеревом Tj. Если (i,j) SST, то, поскольку SST является деревом и, стало быть, связен, (i*,j*) SST, соединяющее Ti с остальной частью SST. Тогда удалим из SST ребро (i*,j*) и добавим ребро (i,j): SST': = SST- (i*, j*) + (i, j). Полученный подграф SST' является остовом, причём более коротким, чем SST, что противоречит выбору SST. • 

Замечание 

Различные способы выбора поддерева для наращивания па первом шаге тела цикла дают различные конкретные варианты алгоритма построения SST.

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

В алгоритме Прима кратчайший остов порождается в процессе разрастания одного дерева, к которому присоединяются одиночные вершины. При этом для каждой вершины v, кроме начальной, используются две пометки: a[v] — это ближайшая к v вершина, уже включённая в остов, a b[v] — это длина ребра, соединяющего v с остовом. Если вершину v ещё нельзя соединить с остовом одним ребром, то а[v]:= 0, b[v]:=

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

Вход: граф G(V,E), заданный матрицей длин рёбер С. 

Выход: множество Т рёбер кратчайшего остова, 

select uV { выбираем произвольную вершину } 

S:={u} { S — множество вершин, включённых в кратчайший остов } 

Т:= { Т — множество рёбер, включённых в кратчайший остов } 

for - u do 

if v Г(u) then 

a[v]:= u {и — ближайшая вершина остова } 

b[v]:= С [u, v] { С[u, v] — длина соответствующего ребра } 

else 

a[v]:= 0 { ближайшая вершина остова неизвестна } 

b[v]:= { и расстояние также неизвестно } 

end if 

end for 

for i from 1 to p - 1 do 

х:= { начальное значение для поиска ближайшей вершины } 

for do 

if then 

{ нашли более близкую вершину } 

{ и расстояние до неё } 

end if 

end for 

{ добавляем найденную вершину в остов } 

{ добавляем найденное ребро в остов } 

for do 

if then 

if then 

{ изменяем ближайшую вершину остова } 

{и длину ведущего к ней ребра } 

end if 

end if 

end for 

end for 

Обоснование

Алгоритм Прима буквально следует схеме алгоритма 9.11. В качестве первого из соединяемых деревьев используется одно и то же разрастающееся дерево Т, а в качестве второго — ближайшая одиночная вершина.

Временная сложность алгоритма прима составляет О(n3), так как для нахождения текущего минимального ребра необходимо перебрать в среднем n2 чисел и сделать это надо n-1 раз

Пример