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