Изменения

Перейти к: навигация, поиск

Критерий Тарьяна минимальности остовного дерева

872 байта добавлено, 19:39, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Критерий Тарьяна ==
{{Теорема
|about=
критерий Тарьяна минимальности остовного дерева
|statement=
Остовное дерево минимально тогда и только тогда, когда любое ребро для любого ребра, не из дерева является максимальным на циклепринадлежащего остову, цикл, который образуется образуемый этим ребром при его добавлении в деревок остову, не содержит рёбер тяжелее этого ребра.
|proof=
Легко заметить, что остовное дерево, не удовлетворяющее условию, не минимально:если существует ребро, не максимальное на образовавшемся цикле, то мы можем уменьшить вес дерева, добавив это ребро и удалив максимальное.<tex> \Rightarrow </tex>
Теперь докажемДокажем, что остовное дерево, состоящее из ребер наименьшего веса на циклах {{---}} минимально. Предположим противное: пусть остовное дерево <tex> A </tex> состоит из всех минимальных ребер на циклах, тогда оно не минимально.  Если <tex> A </tex> не минимально, то его можно улучшить, значит есть ребро, которое имеет наименьший вес на цикле и не принадлежит дереву. Следовательно, дерево построено не на минимальных ребрах в циклах {{---}} противоречие. <tex> \Leftarrow </tex> Построим минимальное остовное дерево <tex>KA </tex>, удовлетворяющее условиюс помощью общего алгоритма построения MST. Докажем, минимальночто оно имеет минимальные ребра на каждом цикле. '''function''' Generic MST(<tex> G </tex>): <tex> A = \{ \} </tex> '''while''' <tex> A </tex> не является остовом '''do''' найти безопасное ребро <tex> ( u, v ) \in E </tex> для <tex> A </tex> <font color = darkgreen>// нужное ребро находится с помощью [[Лемма о безопасном ребре|леммы о безопасном ребре]] </font color = darkgreen> <tex> A = A \cup \{( u, v )\} </tex> '''return''' <tex> A </tex> Заметим, что дерево <tex> A </tex> состоит полностью из безопасных ребер, так как на каждом шаге добавлялось безопасное ребро. Теперь, рассмотрим какой-нибудь разрез <tex> (S, T) </tex> уже построенного дерева <tex> A </tex> и пересекающее ребро <tex> (u, v) </tex>, причем <tex> u \in S </tex>, а <tex> v \in T </tex>. Найдем путь в изначальном графе <tex> G </tex>, соединяющий вершины <tex> u </tex> и <tex> v </tex>. Так как они находятся в разных компонентах связности, то какое-нибудь ребро <tex> (a, b) \notin A</tex> тоже будет пересекать разрез <tex> (S, T) </tex>. Очевидно, что <tex> w(u, v) \leqslant w(a, b) </tex>, так как первое {{---}} безопасное ребро.  Следовательно, любое ребро не принадлежащее <tex> A</tex> не легче ребер принадлежащих <tex> A </tex> на этом цикле.
{{Утверждение
|statement=Для любого разреза <tex>\langle S, T \rangle</tex>, в котором ребро <tex>uv</tex> {{---}} единственное, пересекающее его в <tex>K</tex>, вес этого ребра минимален среди всех ребер <tex>G</tex>, пересекающих этот разрез.
|proof=Рассмотрим ребро <tex>ab \notin K</tex>, пересекающее <tex>\langle S, T \rangle </tex> и путь между вершинами <tex>a</tex> и <tex>b</tex> по дереву <tex>K</tex>.
По условию теоремы, вес <tex>ab</tex> не меньше веса любого ребра на этом пути.
При этом <tex>ab</tex> пересекает <tex>\langle S, T \rangle</tex>, поэтому на этом пути найдется ребро, пересекающее этот разрез.
Но единственное такое ребро в остовном дереве {{---}} это <tex>uv</tex>.
Следовательно, <tex>w(uv) \le w(ab)</tex>.
}}
Для доказательства минимальности <tex>K</tex> построим минимальное остовное дерево графа <tex>G</tex> используя [[алгоритм Краскала]], который представляет собой применение [[Лемма о безопасном ребре|леммы о безопасном ребре]] некоторое число раз.На каждом шаге к строящемуся остову будет добавляться ребро минимального веса, пересекающего некоторый разрез, а этот вес, как было показано в утверждении выше, равен весу ребра из <tex>K</tex>, пересекающего этот разрез.Поэтому вес получившегося минимального остова <tex>G</tex> будет равен весу <tex>K</tex>, что и требовалось.== Уникальность остовного дерева ==
{{Задача
|definition=Проверка уникальности Поиск минимального остовного дерева}}Построим минимальное остовное дерево(MST) используя [[алгоритм Краскала]]. Рассмотрим рёбра <tex>ab</tex> вне остова, посмотрим на максимальное ребро на пути <tex>ab</tex> внутри остова:*Если его вес совпадает с весом ребра <tex>ab</tex>, то заменив ребро из остова ребром вне остова, мы получим остов с точно таким же весом, а значит остов не уникален. *Если и проверка его вес больше ребра из остова, значит заменив рёбра мы получим остов с большим весом, этот случай не влияет на уникальность. *Так же его вес не может быть меньше ребра из остова, иначе мы построили не минимальный остов в начале алгоритма.Искать максимальное ребро на пути <tex>ab</tex> в дереве мы можем при помощи алгоритма минимального общего предка(LCA), используя [[Метод двоичного подъема]].Построим дополнительный массив <tex>D</tex>, при помощи массива двоичных подъёмов. В <tex>D[i][j]</tex> храним номер ребра с максимальным весом на пути <tex>i-root</tex>, где <tex>i</tex> - номер вершины, <tex>j</tex> - степень подъёма(как в LCA). Когда нам нужно получить максимальное ребро на пути <tex>a-b</tex>, ищем максимальное ребро на пути <tex>a-root</tex>, <tex>b-root</tex> и выбираем максимальное из них.
}}
<h4>Алгоритм решения</h4>
Построим минимальное остовное дерево используя [[алгоритм Краскала]].
Рассмотрим рёбра вне остова в любом порядке. Очередное обозначим <tex>e = (u, v)</tex>. Рассмотрим максимальное ребро на пути <tex>u</tex> и <tex>v</tex> внутри остова:
*Если его вес совпадает с весом ребра, то при добавлении ребра в остов, мы получим остов с циклом на котором несколько рёбер имеют одинаковый вес, значит мы можем удалить любое из них и остовное дерево будет всё ещё минимальным, это нарушает уникальность дерева. На этом алгоритм завершается и по критерию Тарьяна мы можем сказать, что в графе можно построить несколько остовных деревьев.
*Если его вес больше ребра, то заменив ребро мы получим остов с большим весом, этот случай не влияет на уникальность.
*Его вес не может быть меньше ребра из остова, иначе мы смогли бы построить минимальное остовное дерево с меньшим весом.
После рассмотрения всех рёбер, если мы не нашли ребро вне остова, при добавлении которого создаётся цикл с максимальным ребром таким же как и на пути <tex>u</tex> и <tex>v</tex>, то в графе нету другого остовного дерева и наше дерево уникально.
Искать максимальное ребро на пути <tex>u</tex> и <tex>v</tex> в дереве мы можем при помощи [[Heavy-light декомпозиция|heavy-light декомпозиции]].
<h4>Асимптотика</h4>
Построение минимального остовного дерева работает за <tex>O(N \log N)</tex>, нахождение максимального ребра за <tex>O(\log N)</tex>, максимальное количество рёбер вне остова не больше <tex>N</tex>, каждое ребро проверяется за <tex>O(\log N)</tex>. Построение LCA и дополнительного массива heavy-light декомпозиции работает за <tex>O(N \log N)</tex>, остов мы построим один раз, LCA heavy-light декомпозицию тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма <tex>O(N \log N)</tex>.
== См.также ==
* [[Остовные деревья: определения, лемма о безопасном ребре]]
* [[Минимально узкое остовное дерево]]
* [[Алгоритм Краскала]]
* [[Алгоритм Борувки]]
* [[Алгоритм Прима]]
==ЛитератураИсточники информации==
* Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. {{---}} Алгоритмы. Построение и анализ.
[[Категория: Алгоритмы и структуры данных]]
[[Категория: Остовные деревья ]]
1632
правки

Навигация