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