Алгоритм Прима — различия между версиями
|  (→Пример) |  (→Пример) | ||
| Строка 28: | Строка 28: | ||
| |[[Файл:Mst_prima_1.png|200px]] | |[[Файл:Mst_prima_1.png|200px]] | ||
| | | | | ||
| − | {| width="100%" | + | {| width="100%" style = "text-align: center" | 
| | '''a''' || '''b''' || '''c''' || '''d''' || '''e''' | | '''a''' || '''b''' || '''c''' || '''d''' || '''e''' | ||
| |- | |- | ||
| Строка 37: | Строка 37: | ||
| |[[Файл:Mst_prima_2.png|200px]] | |[[Файл:Mst_prima_2.png|200px]] | ||
| | | | | ||
| − | {| width="100%" | + | {| width="100%" style = "text-align: center" | 
| | a || '''b''' || '''c''' || '''d''' || '''e''' | | a || '''b''' || '''c''' || '''d''' || '''e''' | ||
| |- | |- | ||
| Строка 46: | Строка 46: | ||
| |[[Файл:Mst_prima_3.png|200px]] | |[[Файл:Mst_prima_3.png|200px]] | ||
| | | | | ||
| − | {| width="100%" | + | {| width="100%" style = "text-align: center" | 
| | a || '''b''' || '''c''' || '''d''' || e | | a || '''b''' || '''c''' || '''d''' || e | ||
| |- | |- | ||
| Строка 55: | Строка 55: | ||
| |[[Файл:Mst_prima_4.png|200px]] | |[[Файл:Mst_prima_4.png|200px]] | ||
| | | | | ||
| − | {| width="100%" | + | {| width="100%" style = "text-align: center" | 
| | a || b || c || '''d''' || e | | a || b || c || '''d''' || e | ||
| |- | |- | ||
Версия 21:19, 11 октября 2014
Алгоритм Прима(англ. Prim's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины величину — вес минимального ребра из вершин в вершину . Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и его ребра — это пары , где , а — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу значение . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом операцию над очередью и обновление . Ребро при этом добавляется к ответу.
Реализация
function Prim(G, w) for v V[G] key[v] p[v] NIL r произвольная вершина в V[G] key[r] 0 Q V[G] while Q v extractMin(Q) for u Adj[v] if u Q and key[u] > w(v, u) key[u] w(v, u) decreaseKey(Q, u, key[u])
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Пример
Рассмотрим работу алгоритма на примере графа.
Корректность
По поддерживаемым инвариантам после извлечения вершины () из ребро является ребром минимального веса, пересекающим разрез . Значит, по лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
Оценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
| Структура данных для приоритетной очереди | Асимптотика времени работы | 
|---|---|
| Наивная реализация | |
| Двоичная куча | |
| Фибоначчиева куча | 
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)
- Википедия - Алгоритм Прима
- Wikipedia - Prim's algorithm
- e-maxx - Минимальное остовное дерево. Алгоритм Прима




