Алгоритм Борувки — различия между версиями
AlexeyL (обсуждение | вклад) |
Novik (обсуждение | вклад) м |
||
Строка 1: | Строка 1: | ||
− | <b>Алгоритм Борувки</b> (англ. ''Borůvka's algorithm'') | + | <b>Алгоритм Борувки</b> (англ. ''Borůvka's algorithm'') {{---}} алгоритм поиска минимального остовного дерева (англ. ''minimum spanning tree, MST'') во взвешенном неориентированном связном графе. |
Впервые был опубликован в 1926 году Отакаром Борувкой. | Впервые был опубликован в 1926 году Отакаром Борувкой. | ||
Строка 25: | Строка 25: | ||
|id=th1. | |id=th1. | ||
|statement=Алгоритм Борувки строит ''MST''. | |statement=Алгоритм Борувки строит ''MST''. | ||
− | |proof=Очевидно, что алгоритм Борувки строит дерево.Будем доказывать что после каждой итерации главного цикла в алгоритме Борувки текущий подграф <tex>T</tex> можно достроить до ''MST''. | + | |proof=Очевидно, что алгоритм Борувки строит дерево.Будем доказывать что после каждой итерации главного цикла в алгоритме Борувки текущий подграф <tex>T</tex> можно достроить до ''MST''. Докажем это по индукции. |
− | + | '''База. ''' <tex>n = 1</tex> (см. [[#lemma1|Лемму]]). | |
− | |||
− | '''База. ''' <tex>n = 1</tex>([[#lemma1| | ||
'''Переход. ''' Пусть лес <tex>T</tex>, получившийся после <tex>n</tex> итераций алгоритма, можно достроить до ''MST''. Докажем, что после <tex>n+1</tex> итерации получившийся лес <tex>T'</tex> можно достроить до ''MST''. Предположим обратное: <tex>T'</tex> нельзя достроить до ''MST''. Тогда существует <tex>F</tex> = ''MST'' графа <tex>G</tex>, содержащее <tex>T</tex> и не содержащее <tex>T'</tex>. Тогда рассмотрим цикл, получающийся добавлением в <tex>F</tex> какого-нибудь ребра <tex>x</tex> из <tex>T' {{---}} T</tex>. На этом цикле имеется ребро, большее по весу чем ребро <tex>x</tex>, иначе компонента для которой <tex>x</tex> является минимальным ребром ни с кем больше ни связана. Исходя из [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]], получаем противоречие. | '''Переход. ''' Пусть лес <tex>T</tex>, получившийся после <tex>n</tex> итераций алгоритма, можно достроить до ''MST''. Докажем, что после <tex>n+1</tex> итерации получившийся лес <tex>T'</tex> можно достроить до ''MST''. Предположим обратное: <tex>T'</tex> нельзя достроить до ''MST''. Тогда существует <tex>F</tex> = ''MST'' графа <tex>G</tex>, содержащее <tex>T</tex> и не содержащее <tex>T'</tex>. Тогда рассмотрим цикл, получающийся добавлением в <tex>F</tex> какого-нибудь ребра <tex>x</tex> из <tex>T' {{---}} T</tex>. На этом цикле имеется ребро, большее по весу чем ребро <tex>x</tex>, иначе компонента для которой <tex>x</tex> является минимальным ребром ни с кем больше ни связана. Исходя из [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]], получаем противоречие. | ||
Строка 38: | Строка 36: | ||
==Реализация== | ==Реализация== | ||
− | У вершины есть поле comp | + | У вершины есть поле comp {{---}} компонента связности, которой принадлежит эта вершина. |
{| width = 100% | {| width = 100% | ||
Строка 98: | Строка 96: | ||
* [[Алгоритм двух китайцев]] | * [[Алгоритм двух китайцев]] | ||
− | == | + | == Источники информации == |
* [http://rain.ifmo.ru/cat/view.php/vis/graph-spanning-trees/mst-2006 Визуализатор алгоритма] | * [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://www.csee.wvu.edu/~ksmani/courses/fa01/random/lecnotes/lecture11.pdf Minimum Spanning Trees] |
Версия 20:49, 26 сентября 2015
Алгоритм Борувки (англ. Borůvka's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе. Впервые был опубликован в 1926 году Отакаром Борувкой.
Содержание
Описание алгоритма
- Построим граф . Изначально содержит все вершины из и не содержит ребер (каждая вершина в графе — отдельная компонента связности).
- Будем добавлять в
- Для каждой компоненты связности находим минимальное по весу ребро, которое связывает эту компоненту с другой.
- Добавим в все найденные рёбра.
ребра следующим образом, пока не является деревом
- Получившийся граф является минимальным остовным деревом графа .
Данный алгоритм может работать неправильно, если в графе есть ребра равные по весу. Например, полный граф из трех вершин, вес каждого ребра равен один. В
могут быть добавлены все три ребра. Избежать эту проблему можно, выбирая в первом пункте среди ребер, равных по весу, ребро с наименьшим номером.Доказательство будем проводить, считая веса всех ребер различными.
Доказательство корректности
Лемма: |
Рассмотрим связный неориентированный взвешенный граф с инъективной весовой функцией .
Тогда после первой итерации главного цикла алгоритма Борувки получившийся подграф можно достроить до MST. |
Доказательство: |
Предположим обратное: пусть любое MST графа критерия Тарьяна, получаем противоречие. | не содержит . Рассмотрим какое-нибудь MST. Тогда существует ребро из такое что не принадлежит MST. Добавив ребро в MST, получаем цикл в котором не максимально, т.к оно было минимальным. Тогда, исходя из
Теорема: |
Алгоритм Борувки строит MST. |
Доказательство: |
Очевидно, что алгоритм Борувки строит дерево.Будем доказывать что после каждой итерации главного цикла в алгоритме Борувки текущий подграф можно достроить до MST. Докажем это по индукции.База. Лемму). (см.Переход. Пусть лес критерия Тарьяна, получаем противоречие. Получаем. , получившийся после итераций алгоритма, можно достроить до MST. Докажем, что после итерации получившийся лес можно достроить до MST. Предположим обратное: нельзя достроить до MST. Тогда существует = MST графа , содержащее и не содержащее . Тогда рассмотрим цикл, получающийся добавлением в какого-нибудь ребра из . На этом цикле имеется ребро, большее по весу чем ребро , иначе компонента для которой является минимальным ребром ни с кем больше ни связана. Исходя из можно достроить до MST. Следовательно предположение индукции верно. |
Реализация
У вершины есть поле comp — компонента связности, которой принадлежит эта вершина.
//— исходный граф // — весовая функция function while for Component // Component — множество компонент связности в // для каждой компоненты связности вес минимального ребра = // разбиваем граф на компоненты связности обычным dfs-ом for if if if for Component // добавляем ребро если его не было в return |
Пример
Асимптотика
Внешний цикл повторяется
раз, так как количество компонент связности каждый раз уменьшается в двое и изначально равно количеству вершин. Что же касается внутреннего цикла, то он выполняется за , где — количество рёбер в исходном графе. Следовательно конечное время работы алгоритма .