Алгоритм Прима — различия между версиями
(→Реализация) |
(→Пример) |
||
Строка 35: | Строка 35: | ||
| | | | ||
{| width="100%" | {| width="100%" | ||
− | + | ! '''a''' || '''b''' || '''c''' || '''d''' || '''e''' | |
|- | |- | ||
− | + | ! <tex> 0 </tex> || <tex>\infty</tex> || <tex>\infty</tex> || <tex>\infty</tex> || <tex>\infty</tex> | |
|} | |} | ||
|style="padding-left: 1em" | Извлечём из множества вершину '''a''', так как её приоритет минимален.<br/>Рассмотрим смежные с ней вершины '''b''', '''c''', и '''e'''. <br/>Обновим их приоритеты, как веса соответствующих рёбер '''ab''', '''ac''' и '''ae''', которые будут добавленны в ответ. | |style="padding-left: 1em" | Извлечём из множества вершину '''a''', так как её приоритет минимален.<br/>Рассмотрим смежные с ней вершины '''b''', '''c''', и '''e'''. <br/>Обновим их приоритеты, как веса соответствующих рёбер '''ab''', '''ac''' и '''ae''', которые будут добавленны в ответ. | ||
Строка 44: | Строка 44: | ||
| | | | ||
{| width="100%" | {| width="100%" | ||
− | + | ! a || '''b''' || '''c''' || '''d''' || '''e''' | |
|- | |- | ||
− | + | ! <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex>\infty</tex> || <tex> 1 </tex> | |
|} | |} | ||
|style="padding-left: 1em" |Теперь минимальный приоритет у вершины '''е'''.<br/> Извлечём её и рассмотрим смежные с ней вершины '''a''', '''c''', и '''d'''.<br/>Изменим приоритет только у вершины '''d''', так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ea''' и '''ec''', и установим приоритет вершины '''d''' равный весу ребра '''ed''', которое будет добавленно в ответ. | |style="padding-left: 1em" |Теперь минимальный приоритет у вершины '''е'''.<br/> Извлечём её и рассмотрим смежные с ней вершины '''a''', '''c''', и '''d'''.<br/>Изменим приоритет только у вершины '''d''', так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ea''' и '''ec''', и установим приоритет вершины '''d''' равный весу ребра '''ed''', которое будет добавленно в ответ. | ||
Строка 53: | Строка 53: | ||
| | | | ||
{| width="100%" | {| width="100%" | ||
− | + | ! a || '''b''' || '''c''' || '''d''' || e | |
|- | |- | ||
− | + | ! <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 7 </tex> || <tex> 1 </tex> | |
|} | |} | ||
|style="padding-left: 1em" |После извлечения вершины '''b''' ничего не изменится, так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ba''' и '''bc'''. Однако, после извлечения следующей вершины - '''c''',<br/>будет обновлён приоритет у вершины '''d''' на более низкий (равный весу ребра '''cd''') и в ответе ребро '''ed''' будет заменено на '''cd'''. | |style="padding-left: 1em" |После извлечения вершины '''b''' ничего не изменится, так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ba''' и '''bc'''. Однако, после извлечения следующей вершины - '''c''',<br/>будет обновлён приоритет у вершины '''d''' на более низкий (равный весу ребра '''cd''') и в ответе ребро '''ed''' будет заменено на '''cd'''. | ||
Строка 62: | Строка 62: | ||
| | | | ||
{| width="100%" | {| width="100%" | ||
− | + | ! a || b || c || '''d''' || e | |
|- | |- | ||
− | + | ! <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 2 </tex> || <tex> 1 </tex> | |
|} | |} | ||
|style="padding-left: 1em" |Далее будет рассмотрена следующая вершина - '''d''', но ничего не изменится,<br/>так как приоритеты вершин '''e''' и '''с''' меньше, чем веса у соответствующих рёбер '''de''' и '''dc'''.<br/>После этого алгоритм завершит работу, так как в заданном множестве не останется вершин,<br/>которые не были бы рассмотрены | |style="padding-left: 1em" |Далее будет рассмотрена следующая вершина - '''d''', но ничего не изменится,<br/>так как приоритеты вершин '''e''' и '''с''' меньше, чем веса у соответствующих рёбер '''de''' и '''dc'''.<br/>После этого алгоритм завершит работу, так как в заданном множестве не останется вершин,<br/>которые не были бы рассмотрены |
Версия 20:27, 11 октября 2014
Алгоритм Прима — алгоритм поиска минимального остовного дерева (minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины величину (вес минимального ребра из вершин в вершину ). Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и его ребра — это пары , где , а — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом операцию над очередью и обновление . Ребро при этом добавляется к ответу.
Реализация
function Prim(G, w) for () произвольная вершина в while ( ) for ( ) if ( и )
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Пример
Задан неориентированный связный граф, требуется построить в нём минимальное остовное дерево.
- Создадим новый граф, содержащий все вершины из заданного графа, но не содержащий рёбер.
- Этот новый граф будет ответом, его множество рёбер будет изменено по ходу выполнения алгоритма.
- Создадим новое множество вершин с внешними значениями - приоритетами, из которого будем извлекать минимум.
- Заполним все приоритеты этого множества бесконечностью.
- Выберем любую вершину, от которой будет начато построение минимального остовного дерева (в примере это вершина a).
- Установим приоритет этой вершины равный нулю.
Корректность
По поддерживаемым инвариантам после извлечения вершины лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
( ) из ребро является ребром минимального веса, пересекающим разрез . Значит, поОценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется
раз, релаксация — раз.Структура данных для приоритетной очереди | Асимптотика времени работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
См. также
Литература
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)