Алгоритм Краскала, Прима для нахождения минимального остовного дерева
Download 285.1 Kb.
|
Алгоритм Краскала
- Bu sahifa navigatsiya:
- Алгоритм Прима
- Разбор конкретного примера
РеализацияРеализовать представленный алгоритм проще всего с помощью СНМ(система непересекающихся отрезков). Вначале, как мы уже раннее говорили, необходимо отсортировать ребра по неубыванию по их весам. Далее с помощью вызовов функции make_set()мы каждую вершину можем поместить в свое собственное дерево, то есть, создаем некоторое множество подграфов. Дальше итерируемся по всем ребрам в отсортированном порядке и смотрим, принадлежат ли инцидентные вершины текущего ребра разным подграфам с помощью функции find_set() или нет, если оба конца лежат в разных компонентах, то объединяем два разных подграфа в один с помощью функции union_sets(). В итоге асимптотическая сложность данного алгоритма сводится к: , где: sort() - make_set()- find_set - union_sets - Псевдокод Алгоритм ПримаСуть самого алгоритма Прима тоже сводится к жадному перебору рёбер, но уже из определенного множества. На входе так же имеется пустой подграф, который и будем достраивать до потенциального минимального остовного дерева. Изначально наш подграф состоит из одной любой вершины исходного графа. Затем из рёбер инцидентных этой вершине, выбирается такое минимальное ребро, которое связала бы две абсолютно разные компоненты связности, одной из которых и является наш подграф. То есть, как только у нас появляется возможность добавить новую вершину в наш подграф, мы тут же включаем ее по минимальмально возможному весу. Продолжаем выполнять предыдущий шаг до тех пор, пока не найдем искомое MST. Разбор конкретного примераВыбираем чисто случайно вершину E,далее рассмотрим все ребра исходящие из нее, включаем в наше остовное дерево ребро C <--> E; w = 9, так как данное ребро имеет минимальный вес из всех рёбер инцидентных множеству вершин нашего подграфа. Имеем следующее: Подграф после добавления 1-го ребра Теперь выборка производится из рёбер: D <--> C; w = 6 A <--> C; w = 8 F <--> E; w = 10 B <--> C; w = 11 D <--> E; w = 11 То есть, в данный момент, мы знаем только о двух вершинах, соответственно, знаем о всех ребрах, исходящих из них. Про связи между другими вершинами, которые не включены в наш подграф, мы ничего не знаем, поэтому они на этом шаге не рассматриваются. Добавляем в наш подграф реброD <--> C и по аналогии добаляем ребро D <--> B. Получаем следующее: Подграф, полученный после добавления рассмотренных рёбер Давайте добьем наш подграф до минимального остовного дерева. Вы, наверное, уже догадались о том, по каким ребрам мы будем связывать наши оставшиеся вершины: A и F. Проводим последние штрихи и получили тот же самый подграф в качестве минимального остовного дерева. Но как мы раннее говорили, сам подграф ничего не решает, главное тут - множество рёбер, которые включены в наше остовное дерево. Искомое минимальное остовное дерево Суммарный вес искомого MST равен 33. Алгоритм Прима — алгоритм построения минимального остовного дерева взвешенного связного неориентированного графа. Алгоритм впервые был открыт в 1930 году чешским математиком Войцехом Ярником, позже переоткрыт Робертом Примом в 1957 году, и, независимо от них, Э. Дейкстрой в 1959 году. Download 285.1 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling