Критерий Тарьяна минимальности остовного дерева — различия между версиями
Filchenko (обсуждение | вклад) м (исправлен ляп)  | 
				м (rollbackEdits.php mass rollback)  | 
				||
| (не показаны 73 промежуточные версии 13 участников) | |||
| Строка 1: | Строка 1: | ||
| + | == Критерий Тарьяна ==  | ||
{{Теорема  | {{Теорема  | ||
|about=  | |about=  | ||
| − | + | критерий Тарьяна минимальности остовного дерева  | |
|statement=  | |statement=  | ||
| − | Остовное дерево минимально тогда и только тогда, когда   | + | Остовное дерево минимально тогда и только тогда, когда для любого ребра, не принадлежащего остову, цикл, образуемый этим ребром при добавлении к остову, не содержит рёбер тяжелее этого ребра.  | 
|proof=  | |proof=  | ||
| − | + | <tex> \Rightarrow </tex>   | |
| − | + | Докажем, что остовное дерево, состоящее из ребер наименьшего веса на циклах {{---}}  минимально.  | |
| − | + | Предположим противное: пусть остовное дерево <tex> A </tex> состоит из всех минимальных ребер на циклах, тогда оно не минимально.    | |
| − | |||
| − | |||
| − | + | Если <tex> A </tex> не минимально, то его можно улучшить, значит есть ребро, которое имеет наименьший вес на цикле и не принадлежит дереву. Следовательно, дерево построено не на минимальных ребрах в циклах {{---}} противоречие.  | |
| − | |||
| − | |||
| − | + | <tex> \Leftarrow </tex>  | |
| − | + | ||
| + | Построим минимальное остовное дерево <tex> A </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> на этом цикле.  | ||
| − | |||
}}  | }}  | ||
| + | |||
| + | == Уникальность остовного дерева ==  | ||
| + | {{Задача  | ||
| + | |definition=Поиск минимального остовного дерева и проверка его на уникальность.  | ||
| + | }}  | ||
| + | <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>. Построение heavy-light декомпозиции работает за <tex>O(N)</tex>, остов мы построим один раз, heavy-light декомпозицию тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма <tex>O(N \log N)</tex>.  | ||
| + | |||
| + | == См.также ==  | ||
| + | * [[Остовные деревья: определения, лемма о безопасном ребре]]  | ||
| + | * [[Минимально узкое остовное дерево]]  | ||
| + | * [[Алгоритм Краскала]]  | ||
| + | * [[Алгоритм Борувки]]  | ||
| + | * [[Алгоритм Прима]]  | ||
| + | |||
| + | ==Источники информации==  | ||
| + | * Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. {{---}} Алгоритмы. Построение и анализ.  | ||
| + | |||
| + | [[Категория: Алгоритмы и структуры данных]]  | ||
| + | [[Категория: Остовные деревья ]]  | ||
Текущая версия на 19:39, 4 сентября 2022
Содержание
Критерий Тарьяна
| Теорема (критерий Тарьяна минимальности остовного дерева): | 
Остовное дерево минимально тогда и только тогда, когда для любого ребра, не принадлежащего остову, цикл, образуемый этим ребром при добавлении к остову, не содержит рёбер тяжелее этого ребра.  | 
| Доказательство: | 
| 
 
 Докажем, что остовное дерево, состоящее из ребер наименьшего веса на циклах — минимально. Предположим противное: пусть остовное дерево состоит из всех минимальных ребер на циклах, тогда оно не минимально. Если не минимально, то его можно улучшить, значит есть ребро, которое имеет наименьший вес на цикле и не принадлежит дереву. Следовательно, дерево построено не на минимальных ребрах в циклах — противоречие. 
 Построим минимальное остовное дерево , с помощью общего алгоритма построения MST. Докажем, что оно имеет минимальные ребра на каждом цикле. function Generic MST(): while не является остовом do найти безопасное ребро для // нужное ребро находится с помощью леммы о безопасном ребре return Заметим, что дерево состоит полностью из безопасных ребер, так как на каждом шаге добавлялось безопасное ребро. Теперь, рассмотрим какой-нибудь разрез уже построенного дерева и пересекающее ребро , причем , а . Найдем путь в изначальном графе , соединяющий вершины и . Так как они находятся в разных компонентах связности, то какое-нибудь ребро тоже будет пересекать разрез . Очевидно, что , так как первое — безопасное ребро. Следовательно, любое ребро не принадлежащее не легче ребер принадлежащих на этом цикле. | 
Уникальность остовного дерева
| Задача: | 
| Поиск минимального остовного дерева и проверка его на уникальность. | 
Алгоритм решения
Построим минимальное остовное дерево используя алгоритм Краскала. Рассмотрим рёбра вне остова в любом порядке. Очередное обозначим . Рассмотрим максимальное ребро на пути и внутри остова:
- Если его вес совпадает с весом ребра, то при добавлении ребра в остов, мы получим остов с циклом на котором несколько рёбер имеют одинаковый вес, значит мы можем удалить любое из них и остовное дерево будет всё ещё минимальным, это нарушает уникальность дерева. На этом алгоритм завершается и по критерию Тарьяна мы можем сказать, что в графе можно построить несколько остовных деревьев.
 - Если его вес больше ребра, то заменив ребро мы получим остов с большим весом, этот случай не влияет на уникальность.
 - Его вес не может быть меньше ребра из остова, иначе мы смогли бы построить минимальное остовное дерево с меньшим весом.
 
После рассмотрения всех рёбер, если мы не нашли ребро вне остова, при добавлении которого создаётся цикл с максимальным ребром таким же как и на пути и , то в графе нету другого остовного дерева и наше дерево уникально. Искать максимальное ребро на пути и в дереве мы можем при помощи heavy-light декомпозиции.
Асимптотика
Построение минимального остовного дерева работает за , нахождение максимального ребра за , максимальное количество рёбер вне остова не больше , каждое ребро проверяется за . Построение heavy-light декомпозиции работает за , остов мы построим один раз, heavy-light декомпозицию тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма .
См.также
- Остовные деревья: определения, лемма о безопасном ребре
 - Минимально узкое остовное дерево
 - Алгоритм Краскала
 - Алгоритм Борувки
 - Алгоритм Прима
 
Источники информации
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. — Алгоритмы. Построение и анализ.