Алгоритм Прима — различия между версиями
(→Идея) |
|||
Строка 3: | Строка 3: | ||
== Идея == | == Идея == | ||
Данный алгоритм очень похож на [[алгоритм Дейкстры]]. Будем последовательно строить поддерево <tex>F</tex> ответа в графе <tex>G</tex>, поддерживая приоритетную очередь <tex>Q</tex> из вершин <tex>G \setminus F</tex>, имеющую ключом для вершины <tex>v</tex> <tex>\min\limits_{u \in F, uv \in EG}w(uv)</tex> (вес минимального ребра из вершин <tex>F</tex> в вершину <tex>v</tex>). Также для каждой вершины очереди будем хранить <tex>p(v)</tex> — вершину <tex>u</tex>, на которой достигается минимум в определении ключа. Дерево <tex>F</tex> поддерживается неявно, и равно <tex>\left\{\left(v,p(v)\right)|v \in G \setminus \{r\} \setminus Q\right\}</tex>, где <tex>r</tex> — корень <tex>F</tex>. Изначально <tex>F</tex> пусто, в очереди все вершины с ключами <tex>+\infty</tex>. Выберём произвольную вершину <tex>r</tex> и присвоим её ключу <tex>0</tex>. На каждом шаге будем извлекать минимальную вершину <tex>v</tex> из приоритетной очереди и релаксировать все ребра <tex>vu</tex>, такие что <tex>u \in Q</tex>, выполняя при этом <tex>\text{DECREASE-KEY}</tex> и обновление <tex>p(v)</tex>. Ребро <tex>\left(v,p(v)\right)</tex> при этом добавляется к ответу. | Данный алгоритм очень похож на [[алгоритм Дейкстры]]. Будем последовательно строить поддерево <tex>F</tex> ответа в графе <tex>G</tex>, поддерживая приоритетную очередь <tex>Q</tex> из вершин <tex>G \setminus F</tex>, имеющую ключом для вершины <tex>v</tex> <tex>\min\limits_{u \in F, uv \in EG}w(uv)</tex> (вес минимального ребра из вершин <tex>F</tex> в вершину <tex>v</tex>). Также для каждой вершины очереди будем хранить <tex>p(v)</tex> — вершину <tex>u</tex>, на которой достигается минимум в определении ключа. Дерево <tex>F</tex> поддерживается неявно, и равно <tex>\left\{\left(v,p(v)\right)|v \in G \setminus \{r\} \setminus Q\right\}</tex>, где <tex>r</tex> — корень <tex>F</tex>. Изначально <tex>F</tex> пусто, в очереди все вершины с ключами <tex>+\infty</tex>. Выберём произвольную вершину <tex>r</tex> и присвоим её ключу <tex>0</tex>. На каждом шаге будем извлекать минимальную вершину <tex>v</tex> из приоритетной очереди и релаксировать все ребра <tex>vu</tex>, такие что <tex>u \in Q</tex>, выполняя при этом <tex>\text{DECREASE-KEY}</tex> и обновление <tex>p(v)</tex>. Ребро <tex>\left(v,p(v)\right)</tex> при этом добавляется к ответу. | ||
+ | |||
+ | |||
+ | Предположим у нас есть множества вершин и ребер ориентированного взвешенного графа. <tex> V </tex> - вершины. <tex> E </tex> - ребра. | ||
+ | В <tex>F</tex> мы будем неявно хранить поддерево ответа. Для каждой вершины в ответе мы будем хранить вершину из которой мы в нее пришли. | ||
+ | То есть <tex>(v,previos(v))</tex> | ||
+ | Хранить <tex>V</tex> мы будем в приоритетной очереди. Ключом для вершины <tex>v</tex> будет вес минимального ребра из v в вершины уже содержащиеся в ответе. То есть <tex>v</tex> <tex>\min\limits_{u \in F, uv \in E}w(uv)</tex>. | ||
+ | Сначала выберем первую вершину искомого остового дерева. Ее мы можем выбрать рандомно. Положим ее в ответ и удалим из <tex>V</tex>. | ||
+ | На каждой итерации мы будем выбирать из <tex>V</tex> вершину с минимальным ключом и добавлять ее к ответу, убирая ее из <tex>V</tex>. | ||
+ | |||
== Реализация == | == Реализация == | ||
'''<tex>\text{Prim}(G, w)</tex>''' | '''<tex>\text{Prim}(G, w)</tex>''' |
Версия 23:10, 17 декабря 2011
Алгоритм Прима — алгоритм поиска минимального остовного дерева (minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины (вес минимального ребра из вершин в вершину ). Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и равно , где — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом и обновление . Ребро при этом добавляется к ответу.
Предположим у нас есть множества вершин и ребер ориентированного взвешенного графа. - вершины. - ребра.
В мы будем неявно хранить поддерево ответа. Для каждой вершины в ответе мы будем хранить вершину из которой мы в нее пришли.
То есть
Хранить мы будем в приоритетной очереди. Ключом для вершины будет вес минимального ребра из v в вершины уже содержащиеся в ответе. То есть .
Сначала выберем первую вершину искомого остового дерева. Ее мы можем выбрать рандомно. Положим ее в ответ и удалим из .
На каждой итерации мы будем выбирать из вершину с минимальным ключом и добавлять ее к ответу, убирая ее из .
Реализация
произвольная вершина в и
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Корректность
По поддерживаемым инвариантам после извлечения вершины лемме о безопасном ребре, оно безопасно. Алгоритм построения 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 |
См. также
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)