Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
дискретка.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
637.38 Кб
Скачать

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

Алгоритм Крускала (или алгоритм Краскала) — алгоритм построения минимального остовного дерева взвешенного связного неориентированного графа.

Формулировка.

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

40.Методы систематического обхода вершин графа. Поиск в глубину

Базой для решения многих задач глобального анализа являются так называемые алгоритмы обхода или поиска.

Необходимо уметь обходить все вершины графа таким образом, чтобы каждая вершина была отмечена ровно один раз. Обычно такое "путешествие" по графу сопровождается нумерацией вершин графа в том порядке, в котором они отмечаются, а также определенной "маркировкой" ребер (или дуг) графа.

Существуют две основные стратегии таких обходов: поиск в глубину и поиск в ширину. Эти стратегии можно описать так.

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

При условии, что в этом списке существует хотя бы одна неотмеченная вершина, продолжаем "путешествие" из первой такой вершины  , действуя как описано выше — "ныряем" вглубь, т.е. просматриваем вершины списка смежности   вершины  , откладывая анализ других элементов   как возможных продолжений поиска "на потом".

Если же неотмеченных вершин в   нет, то возвращаемся из   в ту вершину, из которой мы в нее попали, и продолжаем анализировать список смежности этой вершины.

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

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

На рис. 5.20 показаны примеры поиска в глубину на неориентированном и ориентированном графах.

41.Методы систематического обхода вершин графа. Поиск в ширину

Рассмотрим теперь поиск в ширину. При поиске в ширину "правила игры" такие: достигнув некоторой вершины  , отмечаем ее. Затем просматриваем ее список смежности   и отмечаем все ранее не отмеченные вершины списка (при старте поиска  ). После того как отмечены все вершины из  , вершину   считаем полностью обработанной и продолжаем обработку вершин из списка   по очереди согласно описанным правилам.

Именно в обработке сразу всего списка смежности текущей вершины заключается принципиальное отличие поиска в ширину от поиска в глубину: там мы "ныряли" как можно "глубже", а здесь идем с "бреднем", "загребая" сразу все, что можно.

Поиск в ширину заканчивается, когда все вершины полностью обработаны или продолжение поиска невозможно.

Для сравнения возьмем неориентированный и ориентированный графы предыдущего примера и рассмотрим для них поиск в ширину (рис. 5.21).

Для неориентированного графа (см. рис. 5.21,а) поиск из стартовой вершины   будем осуществлять так. Стартовой вершине присвоим номер 1. Затем пронумеруем все вершины из списка смежности стартовой вершины в порядке следования их в списке. При этом вершина   получит номер 2, а вершина   — номер 3. Теперь, когда все вершины из списка смежности вершины   отмечены, перейдем в первую по очереди вершину  . В ее списке смежности только одна ранее не отмеченная вершина —  . Присвоим ей номер 4 и перейдем в вершину  . На этом этапе номер 5 получит вершина  , а номер 6 — вершина  . Затем перейдем в вершину  . Поскольку все вершины из списка смежности вершины   уже отмечены, перейдем в вершину  . Здесь также все вершины из списка смежности отмечены, поэтому перейдем в вершину  . Просмотрим неотмеченные вершины из ее списка смежности и отметим вершины   и  , присваивая им номера 7 и 8 соответственно. Теперь, когда список смежности вершины   обработан полностью, перейдем в вершину  . Так как в ее списке смежности нет неотмеченных вершин, перейдем в вершину  . Здесь также в списке смежности нет неотмеченных вершин. Все вершины обработаны, и поиск в ширину для графа закончен.