- Алгоритм Краскала
- Идея
- Реализация
- Задача о максимальном ребре минимального веса
- Пример
- Асимптотика
- См. также
- Источники информации
- Алгоритм Прима
- Идея
- Реализация
- Пример
- Корректность
- Оценка производительности
- См. также
- Источники информации
- Минимальное остовное дерево. Алгоритм Прима. Алгоритм Крускала
- Алгоритм Прима
- Реализация алгоритма Прима
- Различия в скорости работы
- brestprog
Алгоритм Краскала
Алгоритм Краскала (англ. Kruskal’s algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Идея
Будем последовательно строить подграф [math]F[/math] графа [math]G[/math] («растущий лес»), пытаясь на каждом шаге достроить [math]F[/math] до некоторого MST. Начнем с того, что включим в [math]F[/math] все вершины графа [math]G[/math] . Теперь будем обходить множество [math]E(G)[/math] в порядке неубывания весов ребер. Если очередное ребро [math]e[/math] соединяет вершины одной компоненты связности [math]F[/math] , то добавление его в остов приведет к возникновению цикла в этой компоненте связности. В таком случае, очевидно, [math]e[/math] не может быть включено в [math]F[/math] . Иначе [math]e[/math] соединяет разные компоненты связности [math]F[/math] , тогда существует [math] \langle S, T \rangle [/math] разрез такой, что одна из компонент связности составляет одну его часть, а оставшаяся часть графа — вторую. Тогда [math]e[/math] — минимальное ребро, пересекающее этот разрез. Значит, из леммы о безопасном ребре следует, что [math]e[/math] является безопасным, поэтому добавим это ребро в [math]F[/math] . На последнем шаге ребро соединит две оставшиеся компоненты связности, полученный подграф будет минимальным остовным деревом графа [math]G[/math] . Для проверки возможности добавления ребра используется система непересекающихся множеств.
Реализация
//— исходный граф // — минимальный остов function for if и в разных компонентах связности return
Задача о максимальном ребре минимального веса
Легко показать, что максимальное ребро в MST минимально. Обратное в общем случае неверно. Но MST из-за сортировки строится за [math]O(E \log E)[/math] . Однако из-за того, что необходимо минимизировать только максимальное ребро, а не сумму всех рёбер, можно предъявить алгоритм, решающий задачу за линейное время.
С помощью алгоритма поиска k-ой порядковой статистики найдем ребро-медиану за [math]O(E)[/math] и разделим множество ребер на два равных по мощности так, чтобы ребра в первом не превосходили по весу ребер во втором. Проверим образуют ли ребра из первого подмножества остов графа, запустив обход в глубину.
- Если да, то рекурсивно запустим алгоритм от него.
- В противном случае сконденсируем получившиеся несвязные компоненты в супервершины и рассмотрим граф с этими вершинами и ребрами из второго подмножества.
На последнем шаге останутся две компоненты связности и одно ребро в первом подмножестве — это максимальное ребро минимального веса.
На каждом шаге ребер становится в два раза меньше, а все операции выполняются за время пропорциональное количеству ребер на текущем шаге, тогда время работы алгоритма [math]O(E+\frac+\frac+. +1)=O(E)[/math] .
Пример
Рёбра (в порядке их просмотра) | ae | cd | ab | be | bc | ec | ed |
Веса рёбер | [math]1[/math] | [math]2[/math] | [math]3[/math] | [math]4[/math] | [math]5[/math] | [math]6[/math] | [math]7[/math] |
Изображение | Описание | ||||||||
---|---|---|---|---|---|---|---|---|---|
Первое ребро, которое будет рассмотрено — ae, так как его вес минимальный. Добавим его к ответу, так как его концы соединяют вершины из разных множеств (a — красное и e — зелёное). Добавим его к ответу, так как его концы соединяют вершины из разных множеств (c — синее и d — голубое). Добавим его к ответу, так как его концы соединяют вершины из разных множеств (a — красное и b — розовое). Оно соединяет вершины из одного множества, поэтому перейдём к следующему ребру bc поэтому после их просмотра они не будут добавлены в ответ АсимптотикаСортировка [math]E[/math] займет [math]O(E\log E)[/math] . См. такжеИсточники информации
Источник Алгоритм ПримаАлгоритм Прима (англ. Prim’s algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе. ИдеяДанный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево [math]F[/math] ответа в графе [math]G[/math] , поддерживая приоритетную очередь [math]Q[/math] из вершин [math]G \setminus F[/math] , в которой ключом для вершины [math]v[/math] является [math]\min\limits_w(uv)[/math] — вес минимального ребра из вершин [math]F[/math] в вершины [math]G \setminus F[/math] . Также для каждой вершины в очереди будем хранить [math]p(v)[/math] — вершину [math]u[/math] , на которой достигается минимум в определении ключа. Дерево [math]F[/math] поддерживается неявно, и его ребра — это пары [math]\left(v,p(v)\right)[/math] , где [math]v \in G \setminus \ \setminus Q[/math] , а [math]r[/math] — корень [math]F[/math] . Изначально [math]F[/math] пусто и значения ключей у всех вершин равны [math]+\infty[/math] . Выберём произвольную вершину [math]r[/math] и присвоим её ключу значение [math]0[/math] . На каждом шаге будем извлекать минимальную вершину [math]v[/math] из приоритетной очереди и релаксировать все ребра [math]vu[/math] , такие что [math]u \in Q[/math] , выполняя при этом операцию [math]\text[/math] над очередью и обновление [math]p(v)[/math] . Ребро [math]\left(v,p(v)\right)[/math] при этом добавляется к ответу. Реализация//— исходный граф // — весовая функция function for null произвольная вершина графа while not for if and Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. ПримерРассмотрим работу алгоритма на примере графа. Пусть произвольно выбранная вершина — это вершина a. КорректностьПо поддерживаемым инвариантам после извлечения вершины [math]v\ (v \neq r)[/math] из [math]Q[/math] ребро [math]\left(v,p(v)\right)[/math] является ребром минимального веса, пересекающим разрез [math]\left(F,Q\right)[/math] . Значит, по лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно [math]|V|-1[/math] раз, корректен. Оценка производительностиПроизводительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется [math]V[/math] раз, релаксация — [math]O(E)[/math] раз.
См. такжеИсточники информации
Источник Минимальное остовное дерево. Алгоритм Прима. Алгоритм КрускалаОстовным деревом графа называется дерево, которое можно получить из него путём удаления некоторых рёбер. У графа может существовать несколько остовных деревьев, и чаще всех их достаточно много. На иллюстрации приведено одно из остовных деревьев (рёбра выделены синим цветом) решёткообразного графа. Для взвешенных графов существует понятие веса остовного дерева, которое определено как сумма весов всех рёбер, входящих в остовное дерево. Из него натурально вытекает понятие минимального остовного дерева — остовного дерева с минимальным возможным весом. Для нахождения минимального остовного дерева графа существуют два основных алгоритма: алгоритм Прима и алгоритм Крускала. Они оба имеют сложность \(O(M \log N)\), поэтому выбор одного из них зависит от ваших личных предпочтений. В этой лекции мы разберём оба. Алгоритм ПримаАлгоритм Прима в идее и реализации очень похож на алгоритм Дейкстры. Как и в алгоритме Дейкстры, мы поддерживаем уже обработанную часть графа (минимального остовного дерева), и постепенно её расширяем за счёт ближайших вершин. Утверждается, что если разделить вершины графа на два множества (обработанные и необработанные), первое из которых составляет связную часть минимального остовного дерева, то ребро минимальной длины, связывающее эти два множества гарантированно будет входить в минимальное остовное дерево. Таким образом, для нахождения минимального остовного дерева начнём с произвольной вершины и будем постепенно добавлять ближайшие к уже имеющимся. На иллюстрации красным цветом выделены рёбра, уже вошедшие в минимальный остов, а чёрным — текущие кандидаты, из которых выбирается ребро с минимальным весом. Реализация алгоритма ПримаБудем искать вес минимального остовного дерева. Для нахождения ближайшей вершины воспользуемся очередью с приоритетом (аналогично алгоритму Дейкстры), в которой будем хранить пары (расстояние от остова до вершины, номер вершины). Различия в скорости работыХотя оба алгоритма работают за \(O(M \log N)\), существуют константные различия в скорости их работы. На разреженных графах (количество рёбер примерно равно количеству вершин) быстрее работает алгоритм Крускала, а на насыщенных (количество рёбер примерно равно квадрату количеству вершин) — алгоритм Прима (при использовании матрицы смежности). На практике чаще используется алгоритм Крускала. brestprogОлимпиадное программирование в Бресте и Беларуси Источник |