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

