ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Дисциплина: «Алгоритмы и структуры данных»
Лабораторная работа №5.
Выполнил: Студент группы ИКПИ-41
Летягина Е. А.
Проверил: Кандидат технических наук, доцент кафедры ПИиВТ
Дагаев А. В.
г. Санкт-Петербург
2026
Постановка задачи
Изучить и сравнить два алгоритма построения минимального остовного дерева на взвешенных неориентированных графах: алгоритм Крускала (с использованием системы непересекающихся множеств) и алгоритм Прима (с использованием приоритетной очереди).
Описание алгоритмов
Алгоритм Крускала:
Алгоритм Крускала строит минимальное остовное дерево путём добавления рёбер в порядке возрастания из веса, если они соединяют разные компоненты связности.
Идея:
Отсортировать все рёбра по весу.
Инициализировать систему непересекающихся множеств для всех вершин.
Для каждого ребра в отсортированном порядке: если вершины ребра находятся в разных компонентах – объединить их и добавить ребро в минимальное остовное дерево.
Сложность алгоритма: O(
),
где V – количество вершин.
Алгоритм Прима:
В методе Прима от исходного графа переходим к его представлению в виде матрицы смежности. На графе выбирается ребро минимального веса. Выбранное ребро вместе с вершинами образует первоначальный фрагмент остовного дерева. Затем анализируются длины ребер от каждой вершины фрагмента до оставшихся невыбранных вершин. Выбирается минимальное ребро и присоединяется к первоначальному фрагменту, и т. д.
Процесс продолжается до тех пор, пока в остовное дерево не будут включены все вершины исходного графа.
Сложность алгоритма: O(
),
где V – количество вершин, E – количество
рёбер.
Описание программы
Программа предназначена для сравнения времени выполнения двух алгоритмов построения минимального остовного дерева на взвешенных неориентированных графах: алгоритм Крускала и алгоритм Прима. Измерение производится многократным запуском алгоритмов с последующим усреднением времени для повышения точности.
В программе используется константное значение 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():
Вывод заголовка таблицы результатов.
Задание параметров эксперимента:
начальный размер графа – 50 вершин;
максимальный размер – 500 вершин;
шаг увеличения – 50 вершин;
количество повторений для усреднения – 1000.
Для каждого размера графа:
Генерация полного графа. Для каждой пары вершин (i, j) добавляется ребро со случайным весом от 1 до 1000. Граф хранится в двух форматах: список рёбер (для Крускала) и список смежности (для Прима).
Многократный (1000 раз) замер времени выполнения алгоритма Крускала с усреднением.
Многократный (1000 раз) замер времени выполнения алгоритма Прима с усреднением.
Вывод среднего времени выполнения для каждого алгоритма в миллисекундах с точностью до 6 знаков.
Завершение программы и освобождение памяти (векторы уничтожаются автоматически).
Программа для исследования алгоритмов поиска кратчайших расстояний написана на языке C++ с использованием библиотек: <chrono> - для точного измерения времени; <queue> - для приоритетной очереди в алгоритме Прима; <random> - для генерации случайных чисел; <algorithm> - для сортировки рёбер в алгоритме Крускала.
