Алгоритм Прима — различия между версиями
(Отмена правки 28315 участника 194.85.161.2 (обсуждение)) |
Alex z (обсуждение | вклад) (добавленн пример) |
||
Строка 20: | Строка 20: | ||
<tex>\text{decrease-key}(Q, u, key[u]) </tex> | <tex>\text{decrease-key}(Q, u, key[u]) </tex> | ||
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. | Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. | ||
+ | |||
+ | ==Пример== | ||
+ | {| border = 1 cellspacing = 2 cellpadding = 5 class = "wikitable" | ||
+ | ! Изображение !! Множество вершин !! Описание | ||
+ | |- | ||
+ | |[[Файл:Mst_prima_1.png|200px]] | ||
+ | | | ||
+ | {| | ||
+ | | '''a''' || '''b''' || '''c''' || '''d''' || '''e''' | ||
+ | |- | ||
+ | | <tex> 0 </tex> || <tex> \inf </tex> || <tex> \inf </tex> || <tex> \inf </tex> || <tex> \inf </tex> | ||
+ | |} | ||
+ | | Извлечём из множества вершину '''a''', так как её приоритет минимален, и рассмотрим её соседей '''b''', '''c''', и '''e'''. <br/>Обновим их приоритеты и добавим в ответ рёбра '''ab''', '''ac''', и '''ae'''. | ||
+ | |- | ||
+ | |[[Файл:Mst_prima_2.png|200px]] | ||
+ | | | ||
+ | {| | ||
+ | | <s>a</s> || '''b''' || '''c''' || '''d''' || '''e''' | ||
+ | |- | ||
+ | | <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> \inf </tex> || <tex> 1 </tex> | ||
+ | |} | ||
+ | | Теперь минимальный приоритет у вершины '''е'''. Извлечём её и рассмотрим её соседей.<br/>Изменим приоритет только у вершины '''d''',так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ea''' и '''ec''', и добавим в ответ ребро '''ed'''. | ||
+ | |- | ||
+ | |[[Файл:Mst_prima_3.png|200px]] | ||
+ | | | ||
+ | {| | ||
+ | | <s>a</s> || '''b''' || '''c''' || '''d''' || <s>e</s> | ||
+ | |- | ||
+ | | <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 7 </tex> || <tex> 1 </tex> | ||
+ | |} | ||
+ | | После извлечения вершины '''b''' ничего не изменится, так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ba''' и '''bc'''. Однако, после извлечения следующий вершины - '''c''',<br/>будет обновлён потенциал у вершины '''d''' на более низкий (равный весу ребра '''cd''') и в ответе ребро '''ed''' будет заменено на '''cd'''. | ||
+ | |- | ||
+ | |[[Файл:Mst_prima_4.png|200px]] | ||
+ | | | ||
+ | {| | ||
+ | | <s>a</s> || <s>b</s> || <s>c</s> || '''d''' || <s>e</s> | ||
+ | |- | ||
+ | | <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 2 </tex> || <tex> 1 </tex> | ||
+ | |} | ||
+ | | Далее будет рассмотрена следующая вершина - '''d''', но ничего не изменится,<br/>так как приоритеты вершин '''e''' и '''с''' меньше, чем веса у соответствующих рёбер '''de''' и '''dc'''.<br/>После этого в заданном множестве не останется вершин, которые не были бы рассмотрены,<br/>алгоритм завершит работу, так как минимальное остовное дерево будет построено. | ||
+ | |} | ||
== Корректность == | == Корректность == |
Версия 04:50, 8 января 2013
Алгоритм Прима — алгоритм поиска минимального остовного дерева (minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины величину (вес минимального ребра из вершин в вершину ). Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и его ребра — это пары , где , а — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом операцию над очередью и обновление . Ребро при этом добавляется к ответу.
Реализация
произвольная вершина в и
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Пример
Корректность
По поддерживаемым инвариантам после извлечения вершины лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
( ) из ребро является ребром минимального веса, пересекающим разрез . Значит, поОценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
Структура данных для приоритетной очереди | Асимптотика времени работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
См. также
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)