Критерий Тарьяна минимальности остовного дерева — различия между версиями
Sketcher (обсуждение | вклад) (→Критерий Тарьяна) |
(→Критерий Тарьяна) |
||
Строка 6: | Строка 6: | ||
Остовное дерево минимально тогда и только тогда, когда для любого ребра, не принадлежащего остову, цикл, образуемый этим ребром при добавлении к остову, не содержит рёбер тяжелее этого ребра. | Остовное дерево минимально тогда и только тогда, когда для любого ребра, не принадлежащего остову, цикл, образуемый этим ребром при добавлении к остову, не содержит рёбер тяжелее этого ребра. | ||
|proof= | |proof= | ||
+ | |||
+ | Легко заметить, что остовное дерево, не удовлетворяющее условию, не минимально. Если для какого-то ребра оказалось, что оно легче некоторых рёбер образуемого цикла, то можно получить остов с меньшим весом, добавив это ребро в остов, и удалив самое тяжелое ребро из цикла. Если же это условие не выполнилось ни для одного ребра, то вес остова при добавлении не изменится. | ||
Рассмотрим общий алгоритм построения минимального остовного дерева <tex> A </tex>, но сначала, ознакомившись с определением [[Лемма о безопасном ребре|безопасного ребра]]. | Рассмотрим общий алгоритм построения минимального остовного дерева <tex> A </tex>, но сначала, ознакомившись с определением [[Лемма о безопасном ребре|безопасного ребра]]. | ||
Строка 18: | Строка 20: | ||
В результате алгоритма получится минимальное остовное дерево <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( | + | Теперь, рассмотрим какой-нибудь разрез <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>, так как второе {{---}} безопасное ребро. |
}} | }} |
Версия 10:51, 25 июня 2017
Содержание
Критерий Тарьяна
Теорема (критерий Тарьяна минимальности остовного дерева): |
Остовное дерево минимально тогда и только тогда, когда для любого ребра, не принадлежащего остову, цикл, образуемый этим ребром при добавлении к остову, не содержит рёбер тяжелее этого ребра. |
Доказательство: |
Легко заметить, что остовное дерево, не удовлетворяющее условию, не минимально. Если для какого-то ребра оказалось, что оно легче некоторых рёбер образуемого цикла, то можно получить остов с меньшим весом, добавив это ребро в остов, и удалив самое тяжелое ребро из цикла. Если же это условие не выполнилось ни для одного ребра, то вес остова при добавлении не изменится. Рассмотрим общий алгоритм построения минимального остовного дерева безопасного ребра. , но сначала, ознакомившись с определениемfunction Generic MST(): while не является остовом do найти безопасное ребро для // нужное ребро находится с помощью "Леммы о безопасном ребре" return В результате алгоритма получится минимальное остовное дерево Теперь, рассмотрим какой-нибудь разрез , состоящее полностью из безопасных ребер, так как на каждом шаге добавлялось безопасное ребро. уже построенного дерева и пересекающее ребро , причем , а . Найдем путь в изначальном графе , соединяющий вершины и . Так как они находятся в разных компонентах связности, то какое-нибудь ребро тоже будет пересекать разрез . Очевидно, что , так как второе — безопасное ребро. |
Уникальность остовного дерева
Задача: |
Поиск минимального остовного дерева и проверка его на уникальность. |
Алгоритм решения
Построим минимальное остовное дерево используя алгоритм Краскала. Рассмотрим рёбра вне остова в любом порядке. Очередное обозначим . Рассмотрим максимальное ребро на пути и внутри остова:
- Если его вес совпадает с весом ребра, то при добавлении ребра в остов, мы получим остов с циклом на котором несколько рёбер имеют одинаковый вес, значит мы можем удалить любое из них и остовное дерево будет всё ещё минимальным, это нарушает уникальность дерева. На этом алгоритм завершается и по критерию Тарьяна мы можем сказать, что в графе можно построить несколько остовных деревьев.
- Если его вес больше ребра, то заменив ребро мы получим остов с большим весом, этот случай не влияет на уникальность.
- Его вес не может быть меньше ребра из остова, иначе мы смогли бы построить минимальное остовное дерево с меньшим весом.
После рассмотрения всех рёбер, если мы не нашли ребро вне остова, при добавлении которого создаётся цикл с максимальным ребром таким же как и на пути heavy-light декомпозиции.
и , то в графе нету другого остовного дерева и наше дерево уникально. Искать максимальное ребро на пути и в дереве мы можем при помощиАсимптотика
Построение минимального остовного дерева работает за
, нахождение максимального ребра за , максимальное количество рёбер вне остова не больше , каждое ребро проверяется за . Построение heavy-light декомпозиции работает за , остов мы построим один раз, heavy-light декомпозицию тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма .См.также
- Остовные деревья: определения, лемма о безопасном ребре
- Минимально узкое остовное дерево
- Алгоритм Краскала
- Алгоритм Борувки
- Алгоритм Прима
Источники информации
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. — Алгоритмы. Построение и анализ.