
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;
}