Алгоритм Прима
Алгоритм Прима(англ. 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])
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Операцию сделать для приоритетной очереди на двоичной куче немного проблематично, поэтому есть два варианта. Первый, написать приоритетную очередь на какой-то сложной куче, например, биноминальной или фибоначчиевой. Второй, изменять значение ключа вершины, для которой вызвали , непосредственно в куче, после чего делать процедуру просеивания вверх для этой вершины. Для быстрого доступа к позиции вершины в куче, нужно дополнительно хранить указатель на эту позицию и не забывать его менять во время изменения кучи.
Пример
Рассмотрим работу алгоритма на примере графа. Пусть произвольно выбранная вершина это вершина a.
Корректность
По поддерживаемым инвариантам после извлечения вершины () из ребро является ребром минимального веса, пересекающим разрез . Значит, по лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
Оценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
| Структура данных для приоритетной очереди | Асимптотика времени работы |
|---|---|
| Наивная реализация | |
| Двоичная куча | |
| Фибоначчиева куча |
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)
- Википедия - Алгоритм Прима
- Wikipedia - Prim's algorithm
- e-maxx - Минимальное остовное дерево. Алгоритм Прима