Изменения

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

Алгоритм Краскала

117 байт убрано, 11:49, 16 декабря 2014
Задача о максимальном ребре минимального веса
Легко показать, что максимальное ребро в MST минимально. Пусть это не так, тогда рассмотрим разрез, который оно пересекает. В этом разрезе должно быть ребро с меньшим весом, иначе максимальное ребро было бы минимальным, но в таком случае минимальный остов не является минимальным, следовательно, максимальное ребро в минимальном остовном дереве минимально. Если же максимальное ребро в остовном дереве минимально, то такое дерево может не быть минимальным. MST из-за сортировки строится за <tex>O(E \log V)</tex>, а дерево, у которого максимальное ребро минимально, можно построить за <tex>O(E)</tex>.
Описанный далее алгоритм ищет максимальное ребро минимального веса и одновременно строит остовное дерево. Поместим каждую вершину графа в своё дерево. На каждой итерации с С помощью [[Поиск_k-ой_порядковой_статистики_за_линейное_время | алгоритма поиска k-ой порядковой статистики]] найдем ребро-медиану за <tex>O(E)</tex> и разделим множество ребер на два равных по мощности подмножества. Запустим [[Использование_обхода_в_глубину_для_проверки_связности|обход в глубину]], чтобы проверить образуют ли ребра из первого подмножества остов графа. Если да, то все безопасные ребра находятся в первом подмножестве, рекурсивно запустим алгоритм от него. В противном случае часть безопасных ребер, включая ребро, которое мы ищем, находится во втором подмножестве. Просмотрим ребра из первого подмножества, если текущее ребро соединяет разные компоненты связности (проверим с помощью [[СНМ (реализация с помощью леса корневых деревьев) | СНМ]] за <tex>O(1)</tex>), то добавим его в остов. Запустим алгоритм от несвязных компонент и ребер второго подмножества. На последнем шаге останутся две компоненты связности и одно ребро в первом подмножестве — это максимальное ребро минимального веса, так как оно наименьшее по весу среди всех ребер, пересекающих <tex> \langle S, T \rangle </tex> разрез между данными компонентами, добавим его в остов. Получившийся остов может не быть минимальным, но все ребра в нем не превосходят по весу ребра, которое мы нашли.
На каждом шаге ребер становится в два раза меньше, а все операции выполняются за время пропорциональное количеству ребер на текущем шаге, тогда время работы алгоритма <tex>O(E+\frac{E}{2}+\frac{E}{4}+...+1)=O(E)</tex>.
Анонимный участник

Навигация