- •Курсовая работа по дисциплине «Алгоритмы и структуры данных» Тема: Реализация алгоритма поиска минимального остова на основе алгоритма Краскала
- •Задание на курсовую работу
- •Введение
- •Алгоритм Крускала и определение графа
- •2. Структура ребра
- •3. Структура графа
- •4. Сортировка пузырьком
- •5. Обход графа
- •6. Чтение матрицы смежности из файла
- •7. Список смежности
- •8. Матрица инцидентности
- •9. Сортировка ребер в лексикографическом порядке
- •10. Оценка общей временной сложности
- •Заключение
- •Список использованных источников
- •Приложение а. Код программы
- •Приложение в пример работы программы
Введение
Цель работы: Реализовать алгоритм поиска минимального остова на основе алгоритма Краскала (Крускала). Продемонстрировать знания следующих тем:
- сортировка,
- обход графов,
- хранение графов,
- построение системы непересекающихся множеств.
Входные данные:
Любой текстовый файл или введённый через консоль набор троек:
A B 3
B C 2
A C 1
Результат в виде отсортированных по имени пар и суммарный вес:
A C
B C
3
Максимальный размер входных данных: 50 вершин
Вершины могут быть заданы любой текстовой последовательностью без пробелов. Вес ребра ограничен интервалом от 0 до 1023 включительно.
Алгоритм Крускала и определение графа
Алгоритм Крускала - это алгоритм поиска минимального остовного дерева в связном взвешенном графе.
Остовное дерево - это подграф, содержащий все вершины исходного графа и являющийся деревом (не содержит циклов). Минимальное остовное дерево - это остовное дерево с минимальной суммой весов его ребер.
Алгоритм Крускала работает следующим образом:
Сортировка всех ребер графа по возрастанию их веса.
Создание пустого графа, который будет представлять минимальное остовное дерево.
Обход по отсортированным ребрам и добавление их в минимальное остовное дерево, если они не создадут цикл с уже добавленными ребрами. Для проверки наличия цикла можно использовать алгоритм поиска в глубину (DFS) или алгоритм объединения множеств.
Повтор шага 3 до тех пор, пока все вершины графа не будут добавлены в минимальное остовное дерево или пока не произойдет обход всех отсортированных ребер.
Алгоритм Крускала имеет временную сложность O(E log E), где E - количество ребер в графе. Это связано с сортировкой ребер по их весу.
Рис.1
2. Структура ребра
Структура Node представляет узел (вершину) в связном списке. Она содержит два поля: data, которое хранит значение текущего узла, и next, указатель на следующий узел в списке. Конструктор класса Node принимает значение data и инициализирует поле next значением nullptr.
Структура Edge представляет ребро в графе. Она содержит три поля: first и end, которые хранят номера вершин, соединенных данным ребром, и weight, который хранит вес ребра (если граф взвешенный).
Рис. 2
3. Структура графа
Графом называется совокупность двух конечных множеств: V – называемого множеством вершин и множества E пар элементов из V, называемого множеством рёбер, если пары не упорядочены, или множеством дуг, если пары упорядочены.
В первом случае граф называется неориентированным, во втором – ориентированным.
Структура Graph представляет собой граф, который может быть представлен как набор вершин и ребер, соединяющих эти вершины. Она содержит три поля: V, которое хранит количество вершин в графе, E, которое хранит количество ребер в графе, и edges, массив ребер, которые соединяют вершины. Также в структуре Graph есть поле adjacencyList, которое представляет массив связных списков, где каждый связный список соответствует одной вершине графа и содержит все ребра, которые соединяют эту вершину с другими вершинами.
Рис. 3
