Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2260.doc
Скачиваний:
71
Добавлен:
24.09.2019
Размер:
3.71 Mб
Скачать

5.1. Алгоритм д. Краскала

Алгоритм Д. Краскала (жадный алгоритм), решающий эту задачу, заключается в следующем.

1. Строим граф , присоединяя к нуль-графу на множестве вершин ребро минимального веса.

2. Если граф уже построен и , то строим граф , где – ребро графа , имеющее минимальный вес среди ребер, не входящих в и не составляющих циклов с ребрами из .

3. Граф является остовом минимального веса в графе .

Сложность алгоритма Краскала составляет

Приведем множественное описание алгоритма Краскала.

Алгоритм 5.1.1. (Краскала, 1956 г.).

Вход: связный взвешенный граф , заданный в виде списка ребер , упорядоченного по неубыванию ребер.

Выход: список S ребер минимального остовного леса графа G.

1. procedure SST1;

2. begin

3. ;

1 SST – shortest sceleton tree

4. SPLIT: ;

5. for to do

6. if , где SPLIT, then

7. begin

8.

9. SPLIT:=(SPLIT ) ;

10. end

11. end.

В этом алгоритме минимальный остов графа G строится последовательным добавлением к S ребра, не вызывающего замыкания цикла [13]. SPLIT содержит разбиение множества вершин V на множества вершин компонент связности графа, определяемого текущим содержанием множества в строке 6. Ребро , анализируемое в строке 6, добавляется к 6 тогда и только тогда, когда оно имеет оба конца в различных блоках разбиения SPLIT, в противном случае его добавление вызвало бы образование цикла. После добавления к S следует заменить блоки A, B SPLIT, содержащие концы ребер , их суммой .

В качестве иллюстрации алгоритма рассмотрим взвешенный граф, изображенный на рис. 5.1.1 слева (на ребрах графа в кружочках указаны их веса). Полагаем . Среди оставшихся ребер минимальный вес имеет, например, ребро . Однако оно не пригодно для построения, поскольку составляет цикл с двумя предыдущими ребрами. Можно взять . Итак, ребра составляют остов минимального веса (граф на рис. 5.1.1 справа).

5.2. Алгоритм р. Прима

Алгоритм Прима (ближайшего соседа) отличается от алгоритма Краскала тем, что на каждом этапе не требует ни сортировки, ни проверки на цикличность.

1. Построение остовного дерева T начинается с произвольной вершины .

2. Среди ребер, инцидентных вершине , выбирается ребро наименьшего веса и включается в дерево T.

3. Повторяя процесс, выполняется поиск наименьшего по весу ребра, соединяющего вершины и u с некоторой другой вершиной графа.

4. Процесс включения ребер продолжается до тех пор, пока все вершины исходного графа G не будут включены в дерево T. Построенное дерево будет минимальным остовным деревом.

В представленном ниже алгоритме строится последовательность , состоящая из деревьев, в которой дерево получается из присоединением ближайшей к дереву вершины. Для эффективной организации выбора такой вершины используются массивы near[ ] и d[ ]. Пусть H –произвольное дерево из последовательности – множество его вершин. По определению d[ ] равно расстоянию от вершины до множества U, т.е.

,

где – вес ребра . Пусть . Тогда near[ ] , т.е. near[ ] – ближайшая к вершина из множества U.

Будем считать, что если , то . Через Min (W), где , обозначим функцию, значениям которой является вершина , имеющая минимальное значение метки d.

Алгоритм 5.2.1 (Прима, 1956 г.).

Вход: связный взвешенный граф G = (V, E, c), заданный матрицей весов .

Выход: минимальный остов T графа G.

1. procedure SST1;

2. begin

3. произвольная вершина из V;

4.

5. for do

6. begin

7. near[ ]:= ; d[ ]:=

8. end;

9. while do

10. begin

11. ;

12. ;

13. for do

14. if d[u] then

15. begin

16. near[u]:= ; d[u]:= ;

17. end

18. end

19. end.

Проиллюстрируем алгоритм Прима на том же графе, что и для алгоритма Краскала (рис. 5.1.1).

Выберем вершину 1 в качестве начальной. Среди ребер, инцидентных вершине 1, выбираем ребро наименьшего веса и включаем его в остовное

1 SST – shortest sсeleton tree

дерево T. Вершина 4 инцидентна ребрам . В остов включаем ребро . Далее в остов включаются ребра или ребра .

Сложность алгоритма Прима составляет . Для полных графов алгоритм Прима менее трудоемок, чем алгоритм Краскала.

В некоторых ситуациях требуется построить остов не минимального, а максимального веса. К этой задаче также применимы и алгоритм Краскала, и алгоритм Прима. Следует только всюду минимальный вес заменить максимальным.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]