Критерий Тарьяна минимальности остовного дерева — различия между версиями
(добавлено см.также) |
(Дополнение(проверка уникальности минимального остова)) |
||
Строка 23: | Строка 23: | ||
На каждом шаге к строящемуся остову будет добавляться ребро минимального веса, пересекающего некоторый разрез, а этот вес, как было показано в утверждении выше, равен весу ребра из <tex>K</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>O(N \log N)</tex>, нахождение максимального ребра за <tex>O(\log N)</tex>, максимальное количество рёбер вне остова не больше <tex>N</tex>, каждое ребро проверяется за <tex>O(\log N)</tex>. Построение LCA и дополнительного массива работает за <tex>O(N \log N)</tex>, остов мы построим один раз, LCA тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма <tex>O(N \log N)</tex>. | ||
== См.также == | == См.также == |
Версия 21:53, 3 января 2017
Теорема (критерий Тарьяна минимальности остовного дерева): | |||||||
Остовное дерево минимально тогда и только тогда, когда любое ребро не из дерева является максимальным на цикле, который образуется при его добавлении в дерево. | |||||||
Доказательство: | |||||||
Легко заметить, что остовное дерево, не удовлетворяющее условию, не минимально: если существует ребро, не максимальное на образовавшемся цикле, то мы можем уменьшить вес дерева, добавив это ребро и удалив максимальное. Теперь докажем, что дерево , удовлетворяющее условию, минимально:
Для доказательства минимальности алгоритм Краскала, который представляет собой применение леммы о безопасном ребре некоторое число раз. На каждом шаге к строящемуся остову будет добавляться ребро минимального веса, пересекающего некоторый разрез, а этот вес, как было показано в утверждении выше, равен весу ребра из , пересекающего этот разрез. Поэтому вес получившегося минимального остова будет равен весу , что и требовалось. построим минимальное остовное дерево графа используя
Построим минимальное остовное дерево(MST) используя алгоритм Краскала. Рассмотрим рёбра вне остова, посмотрим на максимальное ребро на пути внутри остова:
Искать максимальное ребро на пути Метод двоичного подъема. Построим дополнительный массив в дереве мы можем при помощи алгоритма минимального общего предка(LCA), используя , при помощи массива двоичных подъёмов. В храним номер ребра с максимальным весом на пути , где - номер вершины, - степень подъёма(как в LCA). Когда нам нужно получить максимальное ребро на пути , ищем максимальное ребро на пути , и выбираем максимальное из них. | |||||||
Асимптотика
Построение минимального остовного дерева работает за
, нахождение максимального ребра за , максимальное количество рёбер вне остова не больше , каждое ребро проверяется за . Построение LCA и дополнительного массива работает за , остов мы построим один раз, LCA тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма .См.также
Литература
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. — Алгоритмы. Построение и анализ.