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

ЛР6_Шакиров_Айдар_МО-217

.docx
Скачиваний:
10
Добавлен:
31.03.2021
Размер:
101.29 Кб
Скачать

ФГБОУ ВО

Уфимский Государственный Авиационный Технический Университет

Кафедра ВМиК

Отчет по лабораторной работе №6

«Нахождение кратчайших путей в графе. Алгоритм Дейкстры»

по дисциплине

«Структуры и алгоритмы компьютерной обработки данных»

Выполнил:

студент группы МО-217

Шакиров Айдар Рушанович

Проверила:

Канд. техн. наук, доцент

Верхотурова Галина Николаевна

Уфа 2020

Постановка задачи:

Найти кратчайший путь между двумя фиксированными вершинами заданного графа с помощью алгоритма Дейкстры.

Теория

Задача о кратчайшем пути – задача поиска самого короткого пути (цепи) между двумя точками (вершинами) на графе, в которой минимизируется сумма весов рёбер, составляющих путь.

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

  1. Задаем метки всех вершин максимально возможными значениями.

  2. Метку начальной вершины задаем нулем.

  3. Текущую вершину задаем значением начальной вершиной.

  4. Пока не посещены все вершины графа:

    1. Посещаем вершину.

    2. Если текущая вершина равна конечной вершине, то

      1. Переходим к шагу 5.

    3. Перебираем все смежные вершины текущей вершины:

      1. Новую метку задаем суммой метки текущей вершины и расстоянием от смежной вершины к текущей вершине.

      2. Если новая метка меньше метки текущей вершины, то

        1. Метке текущей вершины задаем значение новой метки.

    4. Текущей вершине задаем значение не посещённой вершины с наименьшим значением метки.

  5. Заносим в стек вершин кратчайшего пути конечную вершину.

  6. Пока вершина стека не равна начальной вершине:

    1. Перебираем все смежные вершины вершины стека:

      1. Если метка смежной вершины равна разности метки вершины стека и расстоянием от смежной вершиной к вершине стека, то

        1. Заносим смежную вершину в стек.

        2. Переходим к шагу 6.2.

    2. Если ни одна смежная вершина не была занесена в стек вершин кратчайшего пути, то

      1. Выводим сообщение «Между вершинами нет пути».

      2. Завершаем алгоритм.

  7. Выводим кратчайший путь на экран.

  8. Выводим метку конечной вершины (длину пути) на экран.

Входные данные:

  • matrix[,] – матрица смежности графа.

  • start – номер начальной вершины.

  • end – номер конечной вершины.

Выходные данные:

  • status – текстовое поле для вывода вершин кратчайшего пути между вершинами и длины пути.

  • path – стек для хранения вершин кратчайшего пути между вершинами.

  • distance – длина кратчайшего пути между заданными вершинами.

Реализация алгоритма

private void ShortestPath(int start, int end, int[,] matrix)

{

status.Text = "";

int size = matrix.GetLength(0);

bool[] visited = new bool[size];

int visitedCount = 0;

int[] dist = new int[size];

O(n)

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

{

dist[i] = int.MaxValue;

}

dist[start] = 0;

int current = start;

while (visitedCount <= size)

{

visited[current] = true;

visitedCount++;

if (current == end)

break;

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

if(matrix[current, i] != -1)

O(n2)

O(n)

{

var newDist = dist[current] + matrix[current, i];

dist[i] = Math.Min(newDist, dist[i]);

O(n2)

}

int min = int.MaxValue;

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

if(!visited[i] && dist[i] < min)

O(n)

{

min = dist[i];

current = i;

}

}

var path = new Stack<int>();

path.Push(end);

while (path.Peek() != start)

{

int i;

for (i = 0; i < size; i++)

if (matrix[path.Peek(), i] != -1)

O(n)

if (dist[i] == dist[path.Peek()] - matrix[path.Peek(), i])

O(n2)

{

path.Push(i);

break;

}

if(i == size)

{

status.Text += $"Между вершинами нет пути";

return;

}

O(n)

}

foreach (var v in path)

status.Text += $"<- {v + 1}";

int distance = dist[end];

status.Text += $" | Длина пути = {distance}";

}

где

  • size – количество вершин в графе.

  • visited[] – массив посещенных вершин графа.

  • dist[] – массив меток вершин графа.

  • visitedCount – количество посещенных вершин графа.

  • newDist – переменная, для временного хранения новой метки вершины графа.

  • min – переменная, для временного хранения минимального значения метки вершины графа.

Оценка сложности:

Сложность алгоритма нахождения кратчайшего пути между двумя фиксированными вершинами графа составляет O(n2).

Результат:

  • Отсутствует путь между вершинами 1 и 4 в графе

  • Граф связный

Список литературы:

  1. Вирт, Н. Алгоритмы и структуры данных. Новая версия для Оберона : учебное пособие / Н. Вирт. — Москва : ДМК Пресс, 2010 — 272 с.