77
правок
Изменения
Нет описания правки
<b>Алгоритм Борувки</b> (англ. ''Borůvka's algorithm'') — алгоритм поиска минимального остовного дерева (англ. ''minimum spanning tree, MST'') во взвешенном неориентированном связном графе.
Впервые был опубликован в 1926 году Отакаром Борувкой.
==Описание алгоритма==
Данный алгоритм может работать неправильно, если в графе есть ребра равные по весу. Например, полный граф из трех вершин, вес каждого ребра равен один. В <tex>T</tex> могут быть добавлены все три ребра. Избежать эту проблему можно, выбирая в первом пункте среди ребер, равных по весу, ребро с наименьшим номером.
|id=lemma1
|statement=Рассмотрим связный неориентированный взвешенный граф <tex> G = (V, E) </tex> с инъективной весовой функцией <tex>w : E \to \mathbb{R}</tex> .
Тогда после первой итерации главного цикла алгоритма Борувки получившийся подграф можно достроить до ''MST''.|proof=Предположим обратное: пусть любое ''MST '' графа <tex>G</tex> не содержит <tex>T</tex>. Рассмотрим какое-нибудь ''MST''. Тогда существует ребро <tex>x</tex> из <tex>T</tex> такое что <tex>x</tex> не принадлежит ''MST''. Добавив ребро <tex>x</tex> в ''MST'', получаем цикл в котором <tex>x</tex> не максимально, т.к оно было минимальным. Тогда, исходя из [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]], получаем противоречие.
}}
{{Теорема
|id=th1.
|statement=Алгоритм Борувки строит ''MST''.|proof=Очевидно, что алгоритм Борувки строит дерево.Будем доказывать что после каждой итерации главного цикла в алгоритме Борувки текущий подграф <tex>T</tex> можно достроить до ''MST''.
Докажем это по индукции.
}}
|-
|
|}
==Пример==
{| class = "wikitable"
! Изображение !! Множество рёбер Компоненты связности !! Описание
|-
|[[Файл:Mst_bor_1Step_0.png|200px]]
|
|Переберём все вершины и отметим для каждой вершины инцидентное ей ребро минимального веса.{| width="100%"|Вершина || '''a''' || '''b''' || '''c''' || '''d''' || '''e'''Начальный граф <tex>T</tex>
|-
|Ребро минимального веса [[Файл:Step_1.png|200px]]| <center>'''aea''' || '''abb''' || '''cdc''' || '''cdd''' || '''aee''' </center>|}Распределим вершины по компонентам.
|-
|[[Файл:Mst_bor_21step_2.png|200px]]||Объединим каждую полученную компоненту связности в одну вершину.<br/center>Полученные вершины ''abe'a' и ''cd'' соединяют рёбра 'b''bc' '', 'c''ac' '', 'd''ec''' и 'e''ed'''.<br/center>Выберем среди них ребро с минимальным весом - '''ac''' и положим его |Пометим минимальные пути между полученными вершинамикомпонентами.<br/>
|-
|[[Файл:Mst_bor_31step_3.png|200px]]<br/>[[Файл:Mst_bor_4.png|200px]]|<center>'''ae''' '''abbae''' '''cd'''</center>|Повторим алгоритм борувки на полученном графе, в результате чего он будет сжат Объединим соединившиеся компоненты в одну вершину.и добавим минимальные рёбра к графу <tex>T</tex><br/>
|-
|<center>[[Файл:Mst_bor_51step_4.png|80px200px]]</center>|<center>'''ae''' '''abbae''' '''cd''' '''ac'''</center>|Граф сжат в одну вершину.<br/>Теперь нужно заменить множество рёбер заданного графа на полученное в алгоритмеПометим минимальные пути между компонентами.
|-
|[[Файл:Mst_bor_61step_5.png|200px]]|<center>'''baecd'''</center>|Полученный граф - минимальное остовное дерево заданного графа.Объединим соединившиеся компоненты в одну и добавим минимальные рёбра к графу <tex>T</tex><br/>
|}
==Асимптотика==
==См. также==
* [http://rain.ifmo.ru/cat/view.php/vis/graph-spanning-trees/mst-2006 Визуализатор алгоритма]
* [http://www.csee.wvu.edu/~ksmani/courses/fa01/random/lecnotes/lecture11.pdf Minimum Spanning Trees]
* [http[wikipedia://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D1%80%D1%83%D0%B2%D0%BA%D0%B8 :Алгоритм Борувки|Алгоритм Борувки— Википедия]]
[[Категория: Алгоритмы и структуры данных]]
[[Категория: Остовные деревья ]]