Алгоритм Краскала — различия между версиями
 (→Пример)  | 
				 (→Реализация)  | 
				||
| Строка 6: | Строка 6: | ||
==Реализация==  | ==Реализация==  | ||
| − | <  | + |  <font color=green>// <tex>G</tex> {{---}} исходный граф</font>  | 
| − | <  | + |  <font color=green>// <tex>F</tex> {{---}} минимальный остов</font>  | 
| − | + |  '''function''' <tex>\mathtt{kruskalFindMST}():</tex>  | |
| − | + |     <tex> \mathtt{F}\ =\ \varnothing </tex>  | |
| − | + |     '''for''' <tex>v \in V(G)</tex>  | |
| − | + |        <tex>\mathtt{makeSet}(v)\</tex>  | |
| + |     <tex>\mathtt{sort}(E(G))\</tex>  | ||
| + |     '''for''' <tex>vu \in E(G)</tex> в отсортированном порядке  | ||
| + |        '''if''' <tex>\mathtt{findSet}(u)\ \ne \mathtt{findSet}(v)</tex>  | ||
| + |           <tex> \mathtt{F}\ =\ \mathtt{F}\ \bigcup \mathtt{vu}\</tex>  | ||
| + |           <tex>\mathtt{Union}(v, u)\ </tex>  | ||
==Пример==  | ==Пример==  | ||
Версия 23:25, 3 ноября 2014
Алгоритм Краскала(англ. Kruskal's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Идея
Будем последовательно строить подграф  графа  ("растущий лес"), поддерживая следующий инвариант: на каждом шаге  можно достроить до некоторого MST. Начнем с того, что включим в  все вершины графа . Теперь будем обходить множество  в порядке увеличения веса ребер. Добавление очередного ребра  в  может привести к возникновению цикла в одной из компонент связности . В этом случае, очевидно,  не может быть включено в . В противном случае  соединяет разные компоненты связности , тогда существует разрез  такой, что одна из компонент связности составляет одну его часть, а оставшаяся часть графа - вторую. Тогда  и есть минимальное ребро, пересекающее этот разрез. Значит, из леммы о безопасном ребре следует, что  можно продолжить до MST, поэтому добавим это ребро в .
Несложно понять, что после выполнения такой процедуры получится остовное дерево, при этом его минимальность вытекает из леммы о безопасном ребре.
Реализация
// — исходный граф // — минимальный остов function for for в отсортированном порядке if
Пример
Задан неориентированный связный граф, требуется построить в нём минимальное остовное дерево.
Создадим новый граф, содержащий все вершины из заданного графа, но не содержащий рёбер.
Этот новый граф будет ответом, в него будут добавлены рёбра из заданного графа по ходу выполнения алгоритма.
Отсортируем рёбра заданного графа по их весам и рассмотрим их в порядке возрастания.
| Рёбра (в порядке их просмотра) | ae | cd | ab | be | bc | ec | ed | 
| Веса рёбер | 
Асимптотика
Сортировка  займет .
Работа с  DSU займет , где  - обратная функция Аккермана, которая не превосходит 4 во всех практических приложениях и которую можно принять за константу.
Алгоритм работает за .
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
 - Википедия — Функция Аккермана
 - Википедия — Алгоритм Крускала
 - Wikipedia — Kruskal's algorithm
 - MAXimal :: algo :: Минимальное остовное дерево. Алгоритм Крускала