Алгоритм Краскала — различия между версиями
(→Источники информации) |
(→Пример) |
||
Строка 28: | Строка 28: | ||
|- | |- | ||
|[[Файл:Mst_kruskal_1.png|200px]] | |[[Файл:Mst_kruskal_1.png|200px]] | ||
− | |Первое ребро, которое будет рассмотрено - '''ae''', так как его вес минимальный.<br/> | + | |style="padding-left: 1em" |Первое ребро, которое будет рассмотрено - '''ae''', так как его вес минимальный.<br/> |
Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''a''' - красное и '''e''' -зелёное).<br/> | Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''a''' - красное и '''e''' -зелёное).<br/> | ||
Объединим красное и зелёное множество в одно (красное), так как теперь они соединены ребром. | Объединим красное и зелёное множество в одно (красное), так как теперь они соединены ребром. | ||
|- | |- | ||
|[[Файл:Mst_kruskal_2.png|200px]] | |[[Файл:Mst_kruskal_2.png|200px]] | ||
− | |Рассмотрим следующие ребро - '''cd'''.<br/> | + | |style="padding-left: 1em" |Рассмотрим следующие ребро - '''cd'''.<br/> |
Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''c''' - синие и '''d''' - голубое).<br/> | Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''c''' - синие и '''d''' - голубое).<br/> | ||
Объединим синие и голубое множество в одно (синие), так как теперь они соединены ребром. | Объединим синие и голубое множество в одно (синие), так как теперь они соединены ребром. | ||
|- | |- | ||
|[[Файл:Mst_kruskal_3.png|200px]] | |[[Файл:Mst_kruskal_3.png|200px]] | ||
− | |Дальше рассмотрим ребро '''ab'''.<br/> | + | |style="padding-left: 1em" |Дальше рассмотрим ребро '''ab'''.<br/> |
Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''a''' - красное и '''b''' - розовое).<br/> | Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''a''' - красное и '''b''' - розовое).<br/> | ||
Объединим красное и розовое множество в одно (красное), так как теперь они соединены ребром. | Объединим красное и розовое множество в одно (красное), так как теперь они соединены ребром. | ||
|- | |- | ||
|[[Файл:Mst_kruskal_4.png|200px]] | |[[Файл:Mst_kruskal_4.png|200px]] | ||
− | |Рассмотрим следующие ребро - '''be'''.<br/> | + | |style="padding-left: 1em" |Рассмотрим следующие ребро - '''be'''.<br/> |
Оно соединяет вершины из одного множества, поэтому перейдём к следующему ребру '''bc'''<br/> | Оно соединяет вершины из одного множества, поэтому перейдём к следующему ребру '''bc'''<br/> | ||
Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''b''' - красное и '''c''' - синие).<br/> | Добавим его к ответу, так как его концы соединяют вершины из разных множеств ('''b''' - красное и '''c''' - синие).<br/> | ||
Строка 49: | Строка 49: | ||
|- | |- | ||
|[[Файл:Mst_kruskal_5.png|200px]] | |[[Файл:Mst_kruskal_5.png|200px]] | ||
− | |Рёбра '''ec''' и '''ed''' соединяют вершины из одного множества,<br/> | + | |style="padding-left: 1em" |Рёбра '''ec''' и '''ed''' соединяют вершины из одного множества,<br/> |
поэтому после их рассмотра они не будут добавлены в ответ<br/> | поэтому после их рассмотра они не будут добавлены в ответ<br/> | ||
Всё рёбра были рассмотрены, поэтому алгоритм завершает работу.<br/> | Всё рёбра были рассмотрены, поэтому алгоритм завершает работу.<br/> |
Версия 18:56, 1 ноября 2014
Алгоритм Краскала(англ. Kruskal's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Идея
Будем последовательно строить подграф разрез такой, что одна из компонент связности составляет одну его часть, а оставшаяся часть графа - вторую. Тогда и есть минимальное ребро, пересекающее этот разрез. Значит, из леммы о безопасном ребре следует, что можно продолжить до MST, поэтому добавим это ребро в .
Несложно понять, что после выполнения такой процедуры получится остовное дерево, при этом его минимальность вытекает из леммы о безопасном ребре.
Реализация
Вход: граф
Выход: минимальный остов графа
1)
1) Отсортируем по весу ребер.
2) Заведем систему непересекающихся множеств (DSU) и инициализируем ее множеством .
3) Перебирая ребра в порядке увеличения веса, смотрим, принадлежат ли и одному множеству. Если нет, то объединяем множества, в которых лежат и , и добавляем ребро к .
Пример
Задан неориентированный связный граф, требуется построить в нём минимальное остовное дерево.
Создадим новый граф, содержащий все вершины из заданного графа, но не содержащий рёбер.
Этот новый граф будет ответом, в него будут добавлены рёбра из заданного графа по ходу выполнения алгоритма.
Отсортируем рёбра заданного графа по их весам и рассмотрим их в порядке возрастания.
Рёбра (в порядке их просмотра) | ae | cd | ab | be | bc | ec | ed |
Веса рёбер |
Асимптотика
Сортировка
Работа с DSU займет , где - обратная функция Аккермана, которая не превосходит 4 во всех практических приложениях и которую можно принять за константу.
Алгоритм работает за .
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
- Википедия — Алгоритм Крускала
- Wikipedia — Kruskal's algorithm
- MAXimal :: algo :: Минимальное остовное дерево. Алгоритм Крускала