Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная 4

.docx
Скачиваний:
3
Добавлен:
17.03.2023
Размер:
121.8 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра информационной безопасности

отчет

по лабораторной работе №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;

}

ВЫВОДЫ

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

Соседние файлы в предмете Алгоритмы и структуры данных