Минимально критичное остовное дерево: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
Панзон (обсуждение | вклад) орфография |
Liasmi (обсуждение | вклад) м оформление, проверка орф., пункт. |
||
Строка 1:
'''Минимально критичное остовное дерево''' ({{lang-en|minimum bottleneck spanning tree}}, MBST) во взвешенном неориентированном графе
== Определения ==
Строка 5:
=== Неориентированные графы ===
[[Файл:MBST.png|thumb| Минимально критичное остовное дерево <math>G(V,E)</math>]]
В неориентированном графе <math>G(V, E)</math> и функция <math>w : E \to \R</math>, пусть {{math|''S''}} будет множеством всех остовных деревьев <math>T_i</math>. Пусть <math>B(T_i)</math> будет максимальным по весу ребром для любого остовного дерева <math>T_i</math>. Мы определяем подмножество минимально критичных остовных деревьев ''S''
Граф на рисунке справа является примером MBST, красные рёбра графа образуют MBST графа <math>G(V, E)</math>.
Строка 11:
=== Ориентированные графы ===
[[Файл:Minimum Bottleneck Spanning Arborescence (MBSA).png|thumb| Минимально критичное стягивающее ориентированное дерево ''G(V,E)'']]
Ориентированное стягивающее дерево графа ''G''
Граф справа является примером MBSA, красные рёбра в графе образуют MBSA графа <math>G(V, E)</math>.
== Свойства ==
MST ([[минимальное остовное дерево]], {{lang-en|minimum spanning tree}}) неизбежно является MBST, но MBST не обязательно будет MST{{r|Q3}}{{sfn|Traboulsi|2014}}.
== Алгоритм Камерини для неориентированных графов ==
Камерини предложил{{sfn|Camerini|1978|с=10}} [[алгоритм]], использующийся для получения минимально критичное остовное дерево (MBST) для данного неориентированного связного [[Взвешенный граф|со взвешенными рёбрами графа]] в 1978 году. Алгоритм делит рёбра на два множества. Веса рёбер в одном множестве не превосходят весов в другом. Если [[остовное дерево]] существует в подграфе, состоящем из рёбер исключительно набора с меньшими весами, алгоритм вычисляет MBST в подграфе и MBST этого подграфа будет в точности MBST исходного графа. Если [[остовное дерево]] не существует, алгоритм комбинирует каждую отдельную компоненту в новую супервершину, затем вычисляет MBST в графе, образованном этими супервершинами и рёбрами из множестве рёбер с бо́льшими весами. Лес в каждой отдельной компоненте является частью MBST исходного графа. Продолжаем процесс, пока в графе не останутся две (супер-) вершины и соединяющее их единственное ребро с минимальным весом будет добавлено. MBST состоит из всех рёбер, найденных на предыдущих шагах{{sfn|Traboulsi|2014}}.
=== Псевдокод ===
Процедура имеет два входных параметра. ''G'' является графом, ''w'' является массивом весов всех рёбер графа ''G''{{r|Cui}}.
1 '''function''' MBST(граф ''G'', веса ''w'')
Строка 38 ⟶ 36 :
=== Время работы ===
Алгоритм работает за время ''[[«O» большое и «o» малое|O]]''(''E''), где ''E'' является числом рёбер.
*
*
*
=== Пример ===
Строка 47 ⟶ 45 :
{| border=1 cellspacing=0 cellpadding=5
|[[Файл:Camerini Algorithm 1.svg|200px]]
| Алгоритм делит пополам множество рёбер с учётом весов. Зелёным цветом показаны рёбра, вес которых мал насколько это возможно.
|-
|[[Файл:Camerini Algorithm 2.svg|200px]]
Строка 53 ⟶ 51 :
|-
|[[Файл:Camerini Algorithm 3.svg|400px]]
|Нет остовного дерева в текущем подграфе, образованном рёбрами в текущем меньшем наборе рёбер. Комбинируем вершины разъединённых компонент с супервершинами (показаны красным пунктиром), а затем находим MBST в подграфе, образованном супервершинами и рёбрами в большем наборе рёбер. Лес, образованный каждой разъединённой
|-
|[[Файл:Camerini Algorithm 4.svg|400px]]
Строка 63 ⟶ 61 :
== Алгоритмы MBSA для ориентированных графов ==
Есть два алгоритма для ориентированных графов
=== Алгоритм Камерини для MBSA ===
Строка 79 ⟶ 77 :
9 '''иначе'''
10 MBSA(G,''w,TUB'');
# T представляет подмножество E, для которого известно, что <math>G_T</math> не содержит какого-либо стягивающего ориентированного дерева с корнем в вершине
# UH берёт множество (E-T) рёбер графа G и возвращает <math>A \subset (E-T)</math> such that:
## <math>|A| = \left \lfloor \frac{(|E-T|)}{2} \right \rfloor</math>
## <math>W_a \geqslant W_b</math>
# BUSH(G) возвращает максимальное ориентированное дерево графа G с корнем в вершине
# Окончательным результатом будет S
Строка 97 ⟶ 95 :
|На третьей итерации мы получаем <math>F''</math> и <math>F''</math> является стягивающим ориентированным деревом графа {{mvar|G}}, так что выполняем код <math>MBSA(G_{T''\cup B''}, w, T'')</math>
|-
|
{| border=0 cellspacing=0 cellpadding=5
|<math>MBSA(G_{T'' \cup B''}, w, T'')</math><br>[[Файл:MBSA_Example_10.svg|frameless|150x165px]]
|[[Файл:MBSA_Example_11.svg|frameless|150x195px]]
Строка 123 ⟶ 121 :
10 '''если''' ''w'' ∈ ''F'' и ''c(w) > c(v,w)'' '''то'''
11 ''c''(''w'') = ''c''(''v,w'');
12 ''p''(''w'') = ''v'';
==== Пример ====
Следующий пример показывает работу алгоритма.
{| align="left"
|[[Файл:MBSA-GT-example-1.png|frame|827x827px|На первом шаге алгоритма мы выбираем корень s из графа G, на рисунке выше вершина 6 является корнем s. Затем мы находим все рёбра (6,w)
|-
|[[Файл:MBSA-GT-example-2.png|frame|815x815px|Переходим в вершину 5 графа G, и находим все рёбра (5,w)
|-
|[[Файл:MBSA-GT-example-7.png|frame|885x885px|Переходим в вершину 4 графа G, находим все рёбра (4,w)
|-
|[[Файл:MBSA-GT-example-3.png|frame|880x880px|Переходим в вершину 1 графа G, находим все рёбра (1,w)
|-
|[[Файл:MBSA-GT-example-4.png|frame|797x797px|Переходим в вершину 2 графа G, находим все рёбра (2,w)
|-
|[[Файл:MBSA-GT-example-5.png|frame|876x876px| Переходим в вершину 3 графа G, находим все рёбра (3,w)
|-
|[[Файл:MBSA-GT-example-6.png|frame|800x800px|После просмотра всех вершин графа G алгоритм завершается.]]
|}
Другой подход предложили Тарьян и Габов с границей <math>O(E \log^* V)</math> для разреженных графов, который очень похож на алгоритм Камерини для MBSA, но вместо разбиения множества рёбер на два множества на каждой итерации, вводятся <math>K(i)</math>, в которых ''i'' является числом осуществлённых разбиений, или, другими словами, номер итерации, а <math>K(i)</math> является возрастающей функцией, которая отражает число множеств, которые получаем в результате разбиений на каждой итерации. <math>K(i) = 2^{k(i - 1)}</math> с <math>k(1) = 2</math>. Алгоритм находит <math>\lambda^*</math>, которое является значением веса критичного ребра в любом MBSA. После того, как найдено <math>\lambda^*</math>,
== Примечания ==
{{примечания
<ref name=BST>[http://flashing-thoughts.blogspot.ru/2010/06/everything-about-bottleneck-spanning.html Everything about Bottleneck Spanning Tree]</ref>
<ref name=Q3>{{
== Литература ==
* {{статья
|ref=Traboulsi
Строка 193 ⟶ 189 :
|ссылка=http://www.cs.princeton.edu/research/techreps/TR-104-87
}}
{{изолированная статья}}
[[Категория:Алгоритмы на графах]]
[[Категория:Остовное дерево]]
{{rq|checktranslate|style
|