Алгоритм Прима — различия между версиями
Alex z (обсуждение | вклад) (добавленн пример) |
Alex z (обсуждение | вклад) |
||
Строка 22: | Строка 22: | ||
==Пример== | ==Пример== | ||
− | {| | + | Задан неориентированный связный граф, требуется построить в нём минимальное остовное дерево.<br/> |
+ | Создадим новый граф, содержащий все вершины из заданного графа, но не содержащий рёбер.<br/> | ||
+ | Этот новый граф будет ответом, его множество рёбер будет изменено по ходу выполнения алгоритма.<br/> | ||
+ | Создадим новое множество вершин с внешними значениями - приоритетами, из которого будем извлекать минимум.<br/> | ||
+ | Заполним все приоритеты этого множества бесконечностью.<br/> | ||
+ | Выберем любую вершину, от которой будет начато построение минимального остовного дерева (в примере это вершина '''a''').<br/> | ||
+ | Установим приоритет этой вершины равный нулю. | ||
+ | {| class = "wikitable" | ||
! Изображение !! Множество вершин !! Описание | ! Изображение !! Множество вершин !! Описание | ||
|- | |- | ||
|[[Файл:Mst_prima_1.png|200px]] | |[[Файл:Mst_prima_1.png|200px]] | ||
| | | | ||
− | {| | + | {| width="100%" |
| '''a''' || '''b''' || '''c''' || '''d''' || '''e''' | | '''a''' || '''b''' || '''c''' || '''d''' || '''e''' | ||
|- | |- | ||
| <tex> 0 </tex> || <tex> \inf </tex> || <tex> \inf </tex> || <tex> \inf </tex> || <tex> \inf </tex> | | <tex> 0 </tex> || <tex> \inf </tex> || <tex> \inf </tex> || <tex> \inf </tex> || <tex> \inf </tex> | ||
|} | |} | ||
− | | Извлечём из множества вершину '''a''', так как её приоритет минимален | + | | Извлечём из множества вершину '''a''', так как её приоритет минимален.<br/>Рассмотрим смежные с ней вершины '''b''', '''c''', и '''e'''. <br/>Обновим их приоритеты, как веса соответствующих рёбер '''ab''', '''ac''' и '''ae''', которые будут добавленны в ответ. |
|- | |- | ||
|[[Файл:Mst_prima_2.png|200px]] | |[[Файл:Mst_prima_2.png|200px]] | ||
| | | | ||
− | {| | + | {| width="100%" |
| <s>a</s> || '''b''' || '''c''' || '''d''' || '''e''' | | <s>a</s> || '''b''' || '''c''' || '''d''' || '''e''' | ||
|- | |- | ||
| <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> \inf </tex> || <tex> 1 </tex> | | <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> \inf </tex> || <tex> 1 </tex> | ||
|} | |} | ||
− | | Теперь минимальный приоритет у вершины '''е'''. Извлечём её и рассмотрим | + | | Теперь минимальный приоритет у вершины '''е'''.<br/> Извлечём её и рассмотрим смежные с ней вершины '''a''', '''c''', и '''d'''.<br/>Изменим приоритет только у вершины '''d''', так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ea''' и '''ec''', и установим приоритет вершины '''d''' равный весу ребра '''ed''', которое будет добавленно в ответ. |
|- | |- | ||
|[[Файл:Mst_prima_3.png|200px]] | |[[Файл:Mst_prima_3.png|200px]] | ||
| | | | ||
− | {| | + | {| width="100%" |
| <s>a</s> || '''b''' || '''c''' || '''d''' || <s>e</s> | | <s>a</s> || '''b''' || '''c''' || '''d''' || <s>e</s> | ||
|- | |- | ||
| <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 7 </tex> || <tex> 1 </tex> | | <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 7 </tex> || <tex> 1 </tex> | ||
|} | |} | ||
− | | После извлечения вершины '''b''' ничего не изменится, так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ba''' и '''bc'''. Однако, после извлечения | + | | После извлечения вершины '''b''' ничего не изменится, так как приоритеты вершин '''a''' и '''с''' меньше,<br/>чем веса у соответствующих рёбер '''ba''' и '''bc'''. Однако, после извлечения следующей вершины - '''c''',<br/>будет обновлён приоритет у вершины '''d''' на более низкий (равный весу ребра '''cd''') и в ответе ребро '''ed''' будет заменено на '''cd'''. |
|- | |- | ||
|[[Файл:Mst_prima_4.png|200px]] | |[[Файл:Mst_prima_4.png|200px]] | ||
| | | | ||
− | {| | + | {| width="100%" |
| <s>a</s> || <s>b</s> || <s>c</s> || '''d''' || <s>e</s> | | <s>a</s> || <s>b</s> || <s>c</s> || '''d''' || <s>e</s> | ||
|- | |- | ||
| <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 2 </tex> || <tex> 1 </tex> | | <tex> 0 </tex> || <tex> 3 </tex> || <tex> 4 </tex> || <tex> 2 </tex> || <tex> 1 </tex> | ||
|} | |} | ||
− | | Далее будет рассмотрена следующая вершина - '''d''', но ничего не изменится,<br/>так как приоритеты вершин '''e''' и '''с''' меньше, чем веса у соответствующих рёбер '''de''' и '''dc'''.<br/>После этого в заданном множестве не останется вершин, которые не были бы рассмотрены | + | | Далее будет рассмотрена следующая вершина - '''d''', но ничего не изменится,<br/>так как приоритеты вершин '''e''' и '''с''' меньше, чем веса у соответствующих рёбер '''de''' и '''dc'''.<br/>После этого алгоритм завершит работу, так как в заданном множестве не останется вершин,<br/>которые не были бы рассмотрены |
|} | |} | ||
Строка 82: | Строка 89: | ||
|} | |} | ||
− | == См. также == | + | ==См. также== |
− | * [[Алгоритм | + | * [[Алгоритм Прима]] |
− | * [ | + | * [[Алгоритм Борувки]] |
== Литература == | == Литература == | ||
* ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.) | * ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.) | ||
+ | |||
+ | ==Ссылки== | ||
+ | * [http://rain.ifmo.ru/cat/view.php/vis/graph-spanning-trees/prim-2003 Визуализатор алгоритма №1] | ||
+ | * [http://rain.ifmo.ru/cat/view.php/vis/graph-spanning-trees/mst-2005 Визуализатор алгоритма №2] | ||
+ | * [http://rain.ifmo.ru/cat/view.php/vis/graph-spanning-trees/mst-2006 Визуализатор алгоритма №3] | ||
[[Категория: Алгоритмы и структуры данных]] | [[Категория: Алгоритмы и структуры данных]] | ||
[[Категория: Остовные деревья ]] | [[Категория: Остовные деревья ]] |
Версия 17:25, 17 января 2013
Алгоритм Прима — алгоритм поиска минимального остовного дерева (minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины величину (вес минимального ребра из вершин в вершину ). Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и его ребра — это пары , где , а — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом операцию над очередью и обновление . Ребро при этом добавляется к ответу.
Реализация
произвольная вершина в и
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Пример
Задан неориентированный связный граф, требуется построить в нём минимальное остовное дерево.
Создадим новый граф, содержащий все вершины из заданного графа, но не содержащий рёбер.
Этот новый граф будет ответом, его множество рёбер будет изменено по ходу выполнения алгоритма.
Создадим новое множество вершин с внешними значениями - приоритетами, из которого будем извлекать минимум.
Заполним все приоритеты этого множества бесконечностью.
Выберем любую вершину, от которой будет начато построение минимального остовного дерева (в примере это вершина a).
Установим приоритет этой вершины равный нулю.
Корректность
По поддерживаемым инвариантам после извлечения вершины лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
( ) из ребро является ребром минимального веса, пересекающим разрез . Значит, поОценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
Структура данных для приоритетной очереди | Асимптотика времени работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
См. также
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)