Мы обсудили алгоритм Крускала для минимального остовного дерева . Как и алгоритм Крускала, алгоритм Прима также является алгоритмом Жадности . Это начинается с пустого связующего дерева. Идея состоит в том, чтобы поддерживать два набора вершин. Первый набор содержит вершины, уже включенные в MST, другой набор содержит вершины, которые еще не включены. На каждом этапе он рассматривает все ребра, которые соединяют два набора, и выбирает ребро минимального веса из этих ребер. После выбора края он перемещает другую конечную точку края в набор, содержащий MST.
Группа ребер, которая соединяет два набора вершин в графе, называется разрезом в теории графов . Таким образом, на каждом шаге алгоритма Прима мы находим срез (из двух наборов, один содержит вершины, уже включенные в MST, а другой содержит остальные вершины), выбирает ребро минимального веса из среза и включает эту вершину в набор MST. (набор, который содержит уже включенные вершины).
Как работает алгоритм Prim? Идея алгоритма Прима проста: остовное дерево означает, что все вершины должны быть связаны. Таким образом, два непересекающихся подмножества (обсужденных выше) вершин должны быть соединены, чтобы составить остовное дерево. И они должны быть связаны с минимальным краем веса, чтобы сделать его минимальным остовным деревом.
Алгоритм
1) Создайте набор mstSet, который отслеживает вершины, уже включенные в MST.
2) Присвойте значение ключа всем вершинам входного графа. Инициализируйте все значения ключа как БЕСКОНЕЧНЫЙ. Присвойте ключу значение 0 для первой вершины, чтобы она была выбрана первой.
3) Хотя mstSet не включает в себя все вершины
…. a) Выберите вершину u, которой нет в mstSet и которая имеет минимальное значение ключа.
…. б) Включите u в mstSet.
…. c) Обновить значение ключа всех смежных вершин u . Чтобы обновить значения ключей, выполните итерацию по всем смежным вершинам. Если для каждой смежной вершины v вес ребра uv меньше предыдущего значения ключа v , обновите значение ключа как вес uv
Давайте разберемся со следующим примером:
Набор mstSet изначально пуст, а ключи, назначенные вершинам: {0, INF, INF, INF, INF, INF, INF, INF, INF}, где INF указывает на бесконечность. Теперь выберите вершину с минимальным значением ключа. Вершина 0 выбрана, включите ее в mstSet . Таким образом, mstSet становится {0}. После включения в mstSet обновите значения ключей соседних вершин. Смежные вершины 0 равны 1 и 7. Значения ключей 1 и 7 обновляются как 4 и 8. В следующем подграфе показаны вершины и их ключевые значения, показаны только вершины с конечными значениями ключей. Вершины, включенные в MST, показаны зеленым цветом.
Выберите вершину с минимальным значением ключа и еще не включенную в MST (не в mstSET). Вершина 1 выбрана и добавлена в mstSet. Таким образом, mstSet теперь становится {0, 1}. Обновите значения ключей соседних вершин, равных 1. Значение ключа вершины 2 становится равным 8.
Выберите вершину с минимальным значением ключа и еще не включенную в MST (не в mstSET). Мы можем выбрать вершину 7 или вершину 2, пусть вершина 7 выбрана. Таким образом, mstSet теперь становится {0, 1, 7}. Обновите значения ключей смежных вершин 7. Значение ключа вершин 6 и 8 становится конечным (1 и 7 соответственно).
Выберите вершину с минимальным значением ключа и еще не включенную в MST (не в mstSET). Вершина 6 выбрана. Таким образом, mstSet теперь становится {0, 1, 7, 6}. Обновите значения ключей соседних вершин, равных 6. Значения ключей вершин 5 и 8 обновлены.
Мы повторяем вышеупомянутые шаги, пока mstSet не включает все вершины данного графа. Наконец, мы получаем следующий график.
Как реализовать описанный выше алгоритм?
Мы используем логический массив mstSet [] для представления набора вершин, включенных в MST. Если значение mstSet [v] равно true, то вершина v включается в MST, в противном случае нет. Ключ массива [] используется для хранения значений ключей всех вершин. Другой массив parent [] для хранения индексов родительских узлов в MST. Родительский массив — это выходной массив, который используется для отображения построенного MST.
|
С
|
Джава
|
питон
|
C #
|
Выход:
Edge Weight 0 - 1 2 1 - 2 3 0 - 3 6 1 - 4 5
Сложность времени указанной программы составляет O (V ^ 2). Если входной граф представлен с использованием списка смежности , то временная сложность алгоритма Прима может быть уменьшена до O (E log V) с помощью двоичной кучи. Пожалуйста, см. Prim's MST для представления списка смежности для более подробной информации.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Алгоритм минимального остовного дерева Крускала | Жадный Алго-2
- Минимальное остовное дерево продукта
- Минимальное связующее дерево Крускала с использованием STL в C ++
- Алгоритм Борувки для минимального остовного дерева
- Найти вес минимального остовного дерева
- Приложения задачи минимального остовного дерева
- Минимальная стоимость связующего дерева для данных Графиков
- Обратный алгоритм удаления для минимального остовного дерева
- Найдите минимальное остовное дерево с чередующимися цветными ребрами
- Связующее дерево с максимальной степенью (с использованием алгоритма Крускала)
- Максимально возможный край непересекающегося остовного дерева из полного графика
- Решение проблем для минимальных остовных деревьев (Крускала и Прима)
- Жадный алгоритм, чтобы найти минимальное количество монет
- Корни дерева, которые дают минимальную высоту
- Найти минимальную глубину бинарного дерева
0.00 (0%) 0 votes