Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laba2222Timp.docx
Скачиваний:
0
Добавлен:
29.06.2023
Размер:
569.46 Кб
Скачать

3 Заключение

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

В лабораторной работе были использованы алгоритмы:

1) для нахождения кратчайшего пути – Дейкстра;

2) для нахождения контура минимальной длины – алгоритм ближайшего соседа.

Приложение А

(обязательное)

Листинг кода программы для алгоритма Дейкстра

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main()

{

int big_num(10000);

int matrix[6][6] = {{ 0, 1, 4, 0, 2, 0},

{0, 0, 0, 9, 0, 0},

{ 4, 0 , 0, 7, 0, 0},

{ 0, 9, 7, 0, 0, 2},

{ 0, 0, 0, 0, 0, 8},

{ 0, 0, 0, 0, 0, 0},

};

int pos[6],node[6],min(0),index_min(0);

for(int i = 0;i<6;++i){ // заполняем путь к вершине большими числами,

pos[i] = big_num; // а все вершины помечаем как "непройденные"

node[i] = 0;

}

for(int i = 0;i<6;++i){ // вывод матрицы

for(int j = 0;j<6;++j){

printf(setw(4) matrix[i][j]);

}

Printf( "\n");

}

pos[2] = 0; // назначаем какую-то вершину началом алгоритма, узлом

for(int i = 0;i<4;++i){ // основной цикл

min = big_num;

for(int j = 0;j<6;++j){ // находим вершину с минимальным к ней расстоянием, на первом шаге это будет узел

if(!node[j] && pos[j] < min){

min = pos[j];

index_min = j;

}

}

node[index_min] = true; // помечаем выбранную вершину как пройденную

for(int j = 0;j<6;++j){ // цикл, в котором мы даем всем вершинам, смежным с выбранной вес пути к ней

if(!node[j] && matrix[index_min][j] > 0 && pos[index_min] != big_num && pos[index_min] + matrix[index_min][j] < pos[j]){

pos[j] = pos[index_min] + matrix[index_min][j];

} // условие такое, если эта вершина не пройденная и она смежна с выбранной и если сумма веса выбранной вершины и ребра к текущей будет меньше, чем

} // вес текущей на данный момент, то - меняем значение веса текущей вершины.

}

Printf(pos[0] "\n"); // теперь у нас в pos минимальные расстояния от выбранного узла к любой другой вершине

return 0;

}

Приложение б

(обязательное)

Листинг кода программы алгоритма ближайшего соседа

#include <stdio.h>

#include <malloc.h>

#include <stdbool.h>

int main()

{

bool Check(int key, int mas[], int kol)

{

for (int i = 0; i < kol; i++)

if (mas[i] == key)

return false;

return true;

}

int kol;

printf("Введите кол-во городов\n");

(void)scanf("%d", &kol);

int arr[kol][kol];

//int k = 0;

for (int i = 0; i < kol; i++)

{

for (int j = 0; j < kol; j++)

{

if (i == j)

arr[i][j] = 0;

else

{

printf("Путь от города %d до города %d\n", i, j);

(void)scanf("%d", &arr[i][j]);

//arr[j][i] = arr[i][j];

}

}

//k++;

}

printf("\nМатрица:\n");

for (int i = 0; i < kol; i++)

{

for (int j = 0; j < kol; j++)

{

printf("%d ", arr[i][j]);

}

printf("\n");

}

int* path = (int*)(malloc(sizeof(int)*kol));

for (int i = 0; i < kol; i++)

path[i] = -1;

printf("\nВведите стартовый город\n");

int start;

(void)scanf("%d", &start);

path[0] = start;

int now = start;

int path_len = 0;

for (int i = 1; i < kol; i++)

{ // i - индекс по маршруту и количество переходов, не считая возврата в стартовый город

int min = 10000,min_town=10000;

for (int j = 0; j < kol; j++)

{

if (Check(j, path, kol) && arr[now][j] < min && arr[now][j] > 0)

{ //Нахождение минимума

min = arr[now][j]; // запомнили текущий минимум

min_town = j; // запомнили номер города для текущего минимума

}

}

// а здесь min - действительный минимум и min_town - номер города с минимальным расстоянием от текущего

path_len += min; // добавляем к общему пути

path[i] = min_town; // добавляем город в маршрут

printf("%d -> %d расстояние - %d, путь - %d\n", now, path[i], min, path_len);

now = path[i];

}

path_len += arr[now][start];

printf("%d -> %d расстояние - %d, путь - %d \n", now, start, arr[now][start], path_len);

printf("Общая длина пути: %d", path_len);

return 0;

}

Соседние файлы в предмете Технологии и методы программирования