Алгоритм Прима — различия между версиями
Bloof (обсуждение | вклад) |
(→Реализация) |
||
Строка 5: | Строка 5: | ||
== Реализация == | == Реализация == | ||
− | '''<tex>\text{ | + | '''<tex>\text{Prim}(V, G, w)</tex>''' |
− | + | <tex>for</tex> <tex>v \in V[G]</tex> | |
− | + | <tex>do</tex> <tex> key[v] \leftarrow \infty </tex> | |
<tex>p[v] \leftarrow \text{NIL}</tex> | <tex>p[v] \leftarrow \text{NIL}</tex> | ||
− | <tex>r \leftarrow </tex> произвольная вершина в <tex>V[G]</tex> | + | <tex>r \leftarrow </tex> <tex>произвольная вершина в </tex><tex>V[G]</tex> |
<tex>key[r] \leftarrow 0 </tex> | <tex>key[r] \leftarrow 0 </tex> | ||
<tex>Q \leftarrow V[G] </tex> | <tex>Q \leftarrow V[G] </tex> | ||
− | + | <tex>while</tex> <tex> Q \neq \emptyset </tex> | |
− | + | <tex>do</tex> <tex>u \leftarrow \text{EXTRACT-MIN}(Q) </tex> | |
− | + | <tex>for</tex> <tex> v \in Adj[u] </tex> | |
− | + | <tex>do</tex> <tex>if</tex> <tex>v \in Q</tex> и <tex>key[v] > \omega(u, v) </tex> | |
− | + | <tex>then</tex> <tex> p[v] \leftarrow u </tex> | |
<tex>key[v] \leftarrow \omega(u, v)</tex> | <tex>key[v] \leftarrow \omega(u, v)</tex> | ||
<tex>\text{DECREASE-KEY}(Q, v) </tex> | <tex>\text{DECREASE-KEY}(Q, v) </tex> | ||
− | Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. | + | Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. |
+ | |||
== Корректность == | == Корректность == | ||
По поддерживаемым инвариантам после извлечения вершины <tex>v</tex> (<tex>v \neq r</tex>) из <tex>Q</tex> ребро <tex>\left(v,p(v)\right)</tex> является ребром минимального веса, пересекающим разрез <tex>\left(F,Q\right)</tex>. Значит, по [[Лемма о безопасном ребре|лемме о безопасном ребре]], оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно <tex>|V|-1</tex> раз, корректен. | По поддерживаемым инвариантам после извлечения вершины <tex>v</tex> (<tex>v \neq r</tex>) из <tex>Q</tex> ребро <tex>\left(v,p(v)\right)</tex> является ребром минимального веса, пересекающим разрез <tex>\left(F,Q\right)</tex>. Значит, по [[Лемма о безопасном ребре|лемме о безопасном ребре]], оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно <tex>|V|-1</tex> раз, корректен. |
Версия 07:42, 5 декабря 2011
Алгоритм Прима — алгоритм поиска минимального остовного дерева (minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины (вес минимального ребра из вершин в вершину ). Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и равно , где — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом и обновление . Ребро при этом добавляется к ответу.
Реализация
и
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Корректность
По поддерживаемым инвариантам после извлечения вершины лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
( ) из ребро является ребром минимального веса, пересекающим разрез . Значит, поОценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
Структура данных для приоритетной очереди | Асимптотика времени работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Куча Фибоначчи |
См. также
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)