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

Материал из Викиконспекты
Версия от 21:53, 3 января 2017; 176.59.13.228 (обсуждение) (Дополнение(проверка уникальности минимального остова))
Перейти к: навигация, поиск
Теорема (критерий Тарьяна минимальности остовного дерева):
Остовное дерево минимально тогда и только тогда, когда любое ребро не из дерева является максимальным на цикле, который образуется при его добавлении в дерево.
Доказательство:
[math]\triangleright[/math]

Легко заметить, что остовное дерево, не удовлетворяющее условию, не минимально: если существует ребро, не максимальное на образовавшемся цикле, то мы можем уменьшить вес дерева, добавив это ребро и удалив максимальное.

Теперь докажем, что дерево [math]K[/math], удовлетворяющее условию, минимально:

Утверждение:
Для любого разреза [math]\langle S, T \rangle[/math], в котором ребро [math]uv[/math] — единственное, пересекающее его в [math]K[/math], вес этого ребра минимален среди всех ребер [math]G[/math], пересекающих этот разрез.
[math]\triangleright[/math]

Рассмотрим ребро [math]ab \notin K[/math], пересекающее [math]\langle S, T \rangle [/math] и путь между вершинами [math]a[/math] и [math]b[/math] по дереву [math]K[/math]. По условию теоремы, вес [math]ab[/math] не меньше веса любого ребра на этом пути. При этом [math]ab[/math] пересекает [math]\langle S, T \rangle[/math], поэтому на этом пути найдется ребро, пересекающее этот разрез. Но единственное такое ребро в остовном дереве — это [math]uv[/math].

Следовательно, [math]w(uv) \le w(ab)[/math].
[math]\triangleleft[/math]

Для доказательства минимальности [math]K[/math] построим минимальное остовное дерево графа [math]G[/math] используя алгоритм Краскала, который представляет собой применение леммы о безопасном ребре некоторое число раз. На каждом шаге к строящемуся остову будет добавляться ребро минимального веса, пересекающего некоторый разрез, а этот вес, как было показано в утверждении выше, равен весу ребра из [math]K[/math], пересекающего этот разрез. Поэтому вес получившегося минимального остова [math]G[/math] будет равен весу [math]K[/math], что и требовалось.


Задача:
Проверка уникальности минимального остовного дерева

Построим минимальное остовное дерево(MST) используя алгоритм Краскала. Рассмотрим рёбра [math]ab[/math] вне остова, посмотрим на максимальное ребро на пути [math]ab[/math] внутри остова:

  • Если его вес совпадает с весом ребра [math]ab[/math], то заменив ребро из остова ребром вне остова, мы получим остов с точно таким же весом, а значит остов не уникален.
  • Если его вес больше ребра из остова, значит заменив рёбра мы получим остов с большим весом, этот случай не влияет на уникальность.
  • Так же его вес не может быть меньше ребра из остова, иначе мы построили не минимальный остов в начале алгоритма.

Искать максимальное ребро на пути [math]ab[/math] в дереве мы можем при помощи алгоритма минимального общего предка(LCA), используя Метод двоичного подъема.

Построим дополнительный массив [math]D[/math], при помощи массива двоичных подъёмов. В [math]D[i][j][/math] храним номер ребра с максимальным весом на пути [math]i-root[/math], где [math]i[/math] - номер вершины, [math]j[/math] - степень подъёма(как в LCA). Когда нам нужно получить максимальное ребро на пути [math]a-b[/math], ищем максимальное ребро на пути [math]a-root[/math], [math]b-root[/math] и выбираем максимальное из них.
[math]\triangleleft[/math]

Асимптотика

Построение минимального остовного дерева работает за [math]O(N \log N)[/math], нахождение максимального ребра за [math]O(\log N)[/math], максимальное количество рёбер вне остова не больше [math]N[/math], каждое ребро проверяется за [math]O(\log N)[/math]. Построение LCA и дополнительного массива работает за [math]O(N \log N)[/math], остов мы построим один раз, LCA тоже один раз, каждое ребро мы не больше одного раза проверим на замену, сложность алгоритма [math]O(N \log N)[/math].

См.также

Литература

  • Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. — Алгоритмы. Построение и анализ.