Алгоритм Прима
Алгоритм Прима(англ. Prim's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , в которой ключом для вершины является — вес минимального ребра из вершин в вершину . Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и его ребра — это пары , где , а — корень . Изначально пусто и значения ключей у всех вершин равны . Выберём произвольную вершину и присвоим её ключу значение . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом операцию над очередью и обновление . Ребро при этом добавляется к ответу.
Реализация
function Prim(G, w)
   for каждой вершины v из графа G
       key[v] = 
       p[v] = NIL
   r = произвольная вершина графа G
   key[r] = 0 
   Q.push(все вершины графа G) 
   while Q не пуста
       v = extractMin(Q) 
       for всех u смежных с v
           if u in Q and key[u] > w(v, u)
               p[u] = v
               key[u] = w(v, u)
               Q.decreaseKey(u, key[u])
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Операцию  сделать для приоритетной очереди на  двоичной куче немного проблематично, поэтому есть два варианта. Первый, написать приоритетную очередь на какой-то сложной куче, например,  биноминальной или фибоначчиевой. Второй, изменять значение ключа вершины, для которой вызвали , непосредственно в куче, после чего делать процедуру просеивания вверх для этой вершины. Для быстрого доступа к позиции вершины в куче, нужно дополнительно хранить указатель на эту позицию и не забывать его менять во время изменения кучи.
Пример
Рассмотрим работу алгоритма на примере графа.
Корректность
По поддерживаемым инвариантам после извлечения вершины () из ребро является ребром минимального веса, пересекающим разрез . Значит, по лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
Оценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
| Структура данных для приоритетной очереди | Асимптотика времени работы | 
|---|---|
| Наивная реализация | |
| Двоичная куча | |
| Фибоначчиева куча | 
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)
- Википедия - Алгоритм Прима
- Wikipedia - Prim's algorithm
- e-maxx - Минимальное остовное дерево. Алгоритм Прима




