Скачиваний:
0
Добавлен:
22.09.2026
Размер:
217 Кб
Скачать
☆

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Дисциплина: «Алгоритмы и структуры данных»

Лабораторная работа №5.

Выполнил: Студент группы ИКПИ-41

Летягина Е. А.

Проверил: Кандидат технических наук, доцент кафедры ПИиВТ

Дагаев А. В.

г. Санкт-Петербург

2026

  1. Постановка задачи

Изучить и сравнить два алгоритма построения минимального остовного дерева на взвешенных неориентированных графах: алгоритм Крускала (с использованием системы непересекающихся множеств) и алгоритм Прима (с использованием приоритетной очереди).

  1. Описание алгоритмов

Алгоритм Крускала:

Алгоритм Крускала строит минимальное остовное дерево путём добавления рёбер в порядке возрастания из веса, если они соединяют разные компоненты связности.

Идея:

  1. Отсортировать все рёбра по весу.

  2. Инициализировать систему непересекающихся множеств для всех вершин.

  3. Для каждого ребра в отсортированном порядке: если вершины ребра находятся в разных компонентах – объединить их и добавить ребро в минимальное остовное дерево.

Сложность алгоритма: O( ), где V – количество вершин.

Алгоритм Прима:

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

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

Сложность алгоритма: O( ), где V – количество вершин, E – количество рёбер.

  1. Описание программы

Программа предназначена для сравнения времени выполнения двух алгоритмов построения минимального остовного дерева на взвешенных неориентированных графах: алгоритм Крускала и алгоритм Прима. Измерение производится многократным запуском алгоритмов с последующим усреднением времени для повышения точности.

В программе используется константное значение ITERATIONS = 1000 для количества повторений каждого алгоритма для усреднения, а также генерация полных графов, где каждая пара вершин соединена ребром со случайным весом от 1 до 1000.

Структуры и функции программы:

  • struct Edge – структура, представляющая ребро графа, содержит поля u, v (вершины), weight (вес). Перегружен оператор < для сортировки рёбер по весу.

  • struct DSU – структура, реализующая систему непересекающихся множетств для алгоритма Крускала. Содержит: parent – вектор для хранения родительских вершин; find(int i) – функция поиска корня множества со сжатием пути; unite(int i, int j) – функция объединения двух множеств.

  • void Kruskal(int V, vector<Edge>& edges) – реализует алгоритм Крускала. Сортирует рёбра по весу, затем последовательно добавляет рёбра, соединяющие различные компоненты связности, используя DSU. Алгоритм завершается при добавлении V-1 ребра.

  • void prim(int V, const vector<vector<pair<int, int>>>& adj) – реализует алгоритм Прима с использованием приоритетной очереди. Начиная с вершины 0, на каждом шаге добавляет вершину с наименьшим весом ребра, соединяющего её с текущим деревом.

  • void generateGraph(int V, vector<Edge>& edges, vector<vector<pair<int, int>>>& adj) – генерирует полный граф с заданным количеством вершин. Для каждой пары вершин создаёт ребро со случайным весом от 1 до 1000. Граф сохраняется в двух форматах: список рёбер (для алгоритма Крускала) и список смежностей (для алгоритма Прима).

  • main() — основная функция, управляющая экспериментом. Генерирует случайные графы, выполняет замеры времени и выводит результаты в виде таблицы.

Основные шаги в функции main():

  1. Вывод заголовка таблицы результатов.

  2. Задание параметров эксперимента:

  3. начальный размер графа – 50 вершин;

  4. максимальный размер – 500 вершин;

  5. шаг увеличения – 50 вершин;

  6. количество повторений для усреднения – 1000.

Для каждого размера графа:

Генерация полного графа. Для каждой пары вершин (i, j) добавляется ребро со случайным весом от 1 до 1000. Граф хранится в двух форматах: список рёбер (для Крускала) и список смежности (для Прима).

Многократный (1000 раз) замер времени выполнения алгоритма Крускала с усреднением.

Многократный (1000 раз) замер времени выполнения алгоритма Прима с усреднением.

Вывод среднего времени выполнения для каждого алгоритма в миллисекундах с точностью до 6 знаков.

Завершение программы и освобождение памяти (векторы уничтожаются автоматически).

Программа для исследования алгоритмов поиска кратчайших расстояний написана на языке C++ с использованием библиотек: <chrono> - для точного измерения времени; <queue> - для приоритетной очереди в алгоритме Прима; <random> - для генерации случайных чисел; <algorithm> - для сортировки рёбер в алгоритме Крускала.

Соседние файлы в папке Отчёты Дагаев