Лабораторная 4
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра информационной безопасности
отчет
по лабораторной работе №4
по дисциплине «Алгоритмы и структуры данных»
Тема: Построение минимального остовного дерева
Студенты гр. 1363 |
|
Афанасьев Д.К. Владимиров П.А. |
Преподаватель |
|
Беляев А.В. |
Санкт-Петербург
2022
ЦЕЛЬ РАБОТЫ
Ознакомление с вариантами реализации алгоритмов на графах на примере задачи построения минимального остовного дерева.
ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Алгоритм Прима
Алгоритм начинается с выбора произвольной вершины. Она принимается за часть построенного минимального остовного дерева.
Далее в цикле в каждой итерации рассматриваются только те ребра исходного графа, одна из вершин которых строго принадлежит уже построенной части, а другая строго не принадлежит (если второе условие не проверять, то в графе возникнут циклы). Из списка всех ребер, удовлетворяющих этому условию, выбирается ребро с наименьшим весом и добавляется к построенной части.
Итерации повторяются до тех пор, пока все вершины не окажутся включенными в остовное дерево.
Алгоритм Краскала
Алгоритм начинается с того, что каждая вершина исходного графа помещается в свое множество (состоящее из одной вершины) – компоненту связности.
Далее в цикле в каждой итерации из всех ребер, которые соединяют разные компоненты связности, выбирается ребро с наименьшим весом, и с помощью него две отдельные компоненты связности объединяются в одну.
Итерации повторяются до тех пор, пока количество компонент связности не уменьшится до одной – она и будет представлять собой остовное дерево.
ПРАКТИЧЕСКАЯ ЧАСТЬ
Владимиров Петр (Вариант 5)
AB |
AD |
AE |
BC |
BF |
CD |
CG |
DH |
EF |
EH |
FG |
GH |
18 |
17 |
2 |
12 |
28 |
14 |
10 |
6 |
23 |
11 |
19 |
5 |
Алгоритм Прима
Вершина |
Ребро |
Сумма |
A |
- |
0 |
E |
AE |
2 |
H |
EH |
13 |
D |
HD |
19 |
G |
HG |
24 |
G |
GC |
34 |
B |
CB |
46 |
F |
GF |
65 |
А лгоритм Краскала
Вершина |
Ребро |
Сумма |
A,E |
AE |
2 |
H,G |
HG |
7 |
D |
HD |
13 |
- |
EH |
24 |
C |
GC |
34 |
B |
CB |
46 |
F |
GF |
65 |
Сумма ребер минимального остовного дерева совпала при работе двух алгоритмов, следовательно алгоритмы работают правильно.
ВЫВОД АЛГОРИТМА ГЕНЕРАЦИИ ИСХОДНОГО ГРАФА
Создание ребра:
Номер ребра: 1 Вес: 200 Начало: 0 Конец: 1
Номер ребра: 2 Вес: 37 Начало: 0 Конец: 4
Номер ребра: 3 Вес: 41 Начало: 0 Конец: 7
Номер ребра: 4 Вес: 21 Начало: 0 Конец: 8
Номер ребра: 5 Вес: 16 Начало: 0 Конец: 13
Номер ребра: 6 Вес: 48 Начало: 0 Конец: 14
Номер ребра: 7 Вес: 200 Начало: 1 Конец: 2
Номер ребра: 8 Вес: 28 Начало: 1 Конец: 6
Номер ребра: 9 Вес: 39 Начало: 1 Конец: 7
Номер ребра: 10 Вес: 11 Начало: 1 Конец: 9
Номер ребра: 11 Вес: 34 Начало: 1 Конец: 11
Номер ребра: 12 Вес: 26 Начало: 1 Конец: 12
Номер ребра: 13 Вес: 1 Начало: 1 Конец: 13
Номер ребра: 14 Вес: 11 Начало: 1 Конец: 14
Номер ребра: 15 Вес: 18 Начало: 2 Конец: 3
Номер ребра: 16 Вес: 44 Начало: 2 Конец: 4
Номер ребра: 17 Вес: 23 Начало: 2 Конец: 5
Номер ребра: 18 Вес: 4 Начало: 2 Конец: 6
Номер ребра: 19 Вес: 33 Начало: 2 Конец: 10
Номер ребра: 20 Вес: 200 Начало: 3 Конец: 4
Номер ребра: 21 Вес: 2 Начало: 3 Конец: 6
Номер ребра: 22 Вес: 36 Начало: 3 Конец: 10
Номер ребра: 23 Вес: 200 Начало: 4 Конец: 5
Номер ребра: 24 Вес: 19 Начало: 4 Конец: 10
Номер ребра: 25 Вес: 33 Начало: 5 Конец: 6
Номер ребра: 26 Вес: 5 Начало: 5 Конец: 8
Номер ребра: 27 Вес: 200 Начало: 6 Конец: 7
Номер ребра: 28 Вес: 14 Начало: 6 Конец: 9
Номер ребра: 29 Вес: 33 Начало: 6 Конец: 11
Номер ребра: 30 Вес: 5 Начало: 6 Конец: 12
Номер ребра: 31 Вес: 26 Начало: 6 Конец: 13
Номер ребра: 32 Вес: 200 Начало: 7 Конец: 8
Номер ребра: 33 Вес: 31 Начало: 7 Конец: 13
Номер ребра: 34 Вес: 200 Начало: 8 Конец: 9
Номер ребра: 35 Вес: 28 Начало: 8 Конец: 12
Номер ребра: 36 Вес: 14 Начало: 8 Конец: 14
Номер ребра: 37 Вес: 200 Начало: 9 Конец: 10
Номер ребра: 38 Вес: 28 Начало: 9 Конец: 12
Номер ребра: 39 Вес: 7 Начало: 9 Конец: 14
Номер ребра: 40 Вес: 200 Начало: 10 Конец: 11
Номер ребра: 41 Вес: 7 Начало: 10 Конец: 14
Номер ребра: 42 Вес: 200 Начало: 11 Конец: 12
Номер ребра: 43 Вес: 200 Начало: 12 Конец: 13
Номер ребра: 44 Вес: 25 Начало: 12 Конец: 14
Номер ребра: 45 Вес: 200 Начало: 13 Конец: 14
ВЫВОД ГЕНЕРАЦИИ МИНИМАЛЬНОГО ОСТОВНОГО ДЕРЕВА
ИСХОДНЫЙ КОД ПРОГРАММЫ
#include <iostream>
#include <ctime>
#include <algorithm>
#include <locale>
#define VERSHINU 15
using namespace std;
struct Edge
{
int start;
int end;
int ves;
};
int SozdanieRebra(int MassaRebra[VERSHINU][VERSHINU])
{
srand(time(NULL));
int c = 0;
for (int i = 0; i < VERSHINU - 1; i++)
{
for (int j = i + 1; j < VERSHINU; j++)
{
if (rand() % 100 < 34 && i != j)
{
MassaRebra[i][j] = MassaRebra[j][i] = rand() % 50 + 1;
c++;
}
}
if (MassaRebra[i][i + 1] == 0)
{
MassaRebra[i][i + 1] = MassaRebra[i + 1][i] = 200;
c++;
}
}
return c;
}
void VuvodRebra(int MassaRebra[VERSHINU][VERSHINU])
{
int num = 1,i,j;
printf("\nСоздание ребра:\n\n");
for (i = 0; i < VERSHINU - 1; i++)
{
for (j = i + 1; j < VERSHINU; j++)
{
if (MassaRebra[i][j] != 0)
{
printf("Номер ребра: %d Вес: %d Начало: %d Конец: %d\n",num++, MassaRebra[i][j], i, j);
}
}
}
}
void SortirovkaPoVesy(int MassaRebra[VERSHINU][VERSHINU], Edge* kraya, int c)
{
int C = 0,i,j;
for (i = 0; i < VERSHINU - 1; i++)
{
for (j = i + 1; j < VERSHINU; j++)
{
if (MassaRebra[i][j] != 0)
{
kraya[C].ves = MassaRebra[i][j];
kraya[C].start = i;
kraya[C++].end = j;
}
}
}
for (i = 0; i < c; ++i)
{
for (j = 0; j < i; ++j)
{
if (kraya[i].ves < kraya[j].ves)
{
swap(kraya[i], kraya[j]);
}
}
}
}
int Alg_Kruscal(int c, Edge* kraya)
{
int Componets[VERSHINU], i, j, SymmaVesov = 0, Prevedyshiu_Comp, Sledyshi_Comp;
for (i = 0; i < VERSHINU; ++i)
{
Componets[i] = i;
}
printf("\nВеса ребер связующего дерева\n\n");
for (i = 0; i < c; i++)
{
Edge VubrannuKrai = kraya[i];
if (Componets[VubrannuKrai.start] != Componets[VubrannuKrai.end])
{
Prevedyshiu_Comp = Componets[VubrannuKrai.start];
Sledyshi_Comp = Componets[VubrannuKrai.end];
printf("Номер сортировки: %d Добавленный край (%d, %d) вес: %d\n",i, VubrannuKrai.start, VubrannuKrai.end, VubrannuKrai.ves);
for (j = 0; j < VERSHINU; j++)
{
if (Componets[j] == Prevedyshiu_Comp)
{
Componets[j] = Sledyshi_Comp;
}
}
SymmaVesov += VubrannuKrai.ves;
}
}
return SymmaVesov;
}
int main()
{
setlocale(LC_ALL, "Russian");
int massa_rober[VERSHINU][VERSHINU] = {0}, kraya, Summa;
kraya = SozdanieRebra(massa_rober);
Edge* Oxvatuvashe_derevo = new Edge[kraya];
VuvodRebra(massa_rober);
SortirovkaPoVesy(massa_rober, Oxvatuvashe_derevo, kraya);
Summa = Alg_Kruscal(kraya, Oxvatuvashe_derevo);
cout << endl;
printf("Сумма минимального остовного дерева: %d\n",Summa);
return 0;
}
ВЫВОДЫ
В ходе данной лабораторной работы были изучены алгоритмы построения минимального остовного дерева, а именно алгоритм Прима и алгоритм Краскала.