Скачиваний:
0
Добавлен:
02.11.2025
Размер:
68.02 Кб
Скачать

Алгоритм Дейкстры

Алгоритм Дейкстры – алгоритм поиска кратчайшего расстояния от одной вершины графа до всех остальных. Перед началом работы каждой вершине приписывается её вес: для начальной вершины, для которой производится поиск расстояний, он равен нулю, для всех остальных – бесконечность. Затем инициализируется обход графа – обновляются веса всех смежных вершин, вес вычисляется исходя из длины ребра. После чего из смежных вершин выбирается та, вес которой минимален, она становится ключевой. К ключевой вершине повторяются все предыдущие действия, но вес рассчитывается из минимума нынешнего веса смежной вершины и суммы весов ключевой вершины и ребра, что соединяет её со смежной вершиной. Всё это повторяется до тех пор, пока не будет пройден весь граф и не будет найдено кратчайшее расстояние до каждой из вершин.

Сравнивая с алгоритмом Флойда-Уоршелла, алгоритм Дейкстры более частный, поскольку он находит кратчайшие расстояния только от одной вершины ко всем.

Пример работы

Дан взвешенный неориентированный граф:

Рисунок 2. Граф для примера работы алгоритма

  1. Шаг 1. Вес всех вершин, кроме начальной (пусть будет 1), устанавливается равным бесконечности. Вес начальной вершины 1 устанавливается равным нулю.

  2. Шаг 2. Вес вершин, которые смежные с начальной, обновляется: 2 : 5 5 : 3 3 : 7

  3. Шаг 3. Следующей точкой для действий выбирается та, вес которой минимален. Это вершина 5. Обновляется вес вершин, которые смежные с вершиной 5 – в том случае, если старый вес больше, чем сумма веса вершины 5 и ребра, что соединяет вершину 5 со смежной вершиной: 2 : 4 4 : 5

  4. Шаг 4. Все вершины посещены, алгоритм прекращает свою работу. Затрачено 4 шага. Кратчайшие расстояния от вершины 1 до всех остальных вершин графа найдены и равны: 1 – 2 : 4 1 – 3 : 7 1 – 4 : 5 1 – 5 : 3

Описание программы

Программа включает в себя несколько функций, как:

  1. int get_random_graph(int** graph, int size)

  2. void floyd(int** mtx, int size)

  3. int *Dijkstra(int **GR, int V, int st)

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

Функция 2 – алгоритм Флойда-Уоршелла. Функции передаётся в качестве аргументов указатель на матрицу смежности и её размер. После обработки алгоритмом матрица становится матрицей кратчайших расстояний.

Функция 3 – алгоритм Дейкстры. Функция возвращает указатель на массив расстояний от одной вершины до всех остальных. Функции передаётся в качестве аргументов указатель на матрицу смежности, её размер и номер вершины, для которой осуществляется поиск.

Сравнение и тестирование

Проведя сравнение времени, затрачиваемого на алгоритмы Флойда-Уоршелла и Дейкстры были получены следующие графики:

Время в нс

Количество вершин графа

На рисунке оранжевым цветом представлен алгоритм Дейкстры, синим – Флойда-Уоршелла. По графику видно, что при увеличении размерности матрицы смежности (то есть, при увеличении количества вершин графа) время, затрачиваемое на обработку алгоритмов, увеличивается тоже. Но стоит отметить, что на алгоритм Флойда-Уоршелла времени затрачивается много больше, нежели чем на алгоритм Дейкстры. Это связано с тем, что сложность алгоритма Флойда-Уоршелла сильно выше, чем алгоритма Дейкстры.

Это также подтверждается небольшим примером: в графе на 5 вершин на алгоритм Флойда-Уоршелла было затрачено 5 шагов, а на алгоритм Дейкстры – 4 шага.

Рисунок 3. Граф для алгоритмов

Алгоритм Дейкстры

Шаг 1

Инициализация. Алгоритм начинается с установки начальных значений. Вершина 1 получает вес 0, так как это начальная точка. Все остальные вершины получают вес "бесконечность", поскольку расстояния до них пока неизвестны.

Шаг 2

Обработка смежных вершин. Происходит обновление весов вершин, непосредственно соединенных с начальной вершиной 1. Вершина 2 получает вес 5, вершина 5 получает вес 3, а вершина 3 получает вес 7. Эти значения соответствуют длинам рёбер, соединяющих их с вершиной 1.

Шаг 3

Алгоритм выбирает вершину с наименьшим весом среди необработанных - это вершина 5 (вес 3). Происходит обновление весов её соседей: вес вершины 2 уменьшается до 4 (было 5), а вершина 4 получает вес 5. Обновление происходит только если новый путь короче существующего.

Шаг 4

Завершение. Алгоритм завершает работу, так как все вершины были посещены. Найдены кратчайшие пути от вершины 1 до всех остальных: до вершины 2: 4 единицы, до вершины 3: 7 единиц, до вершины 4: 5 единиц, до вершины 5: 3 единицы

Алгоритм Флойда-Уоршелла

Исходные данные. В начале алгоритма известны только непосредственные расстояния между соединенными вершинами графа: от вершины 1 до 2 (5 единиц), от 1 до 5 (3 единицы), от 1 до 3 (7 единиц), от 2 до 5 (1 единица), от 3 до 4 (4 единицы) и от 4 до 5 (2 единицы).

Шаг 1

Через первую вершину. Алгоритм анализирует маршруты, проходящие через вершину 1. Обнаруживаются новые пути: от вершины 3 через 1 до 2 (длина 12) и от 3 через 1 до 5 (длина 10).

Шаг 2

Через вторую вершину. Рассматриваются маршруты через вершину 2. Находятся пути: от 3 через 1-2 до 5 (длина 13) и от 1 через 2 до 5 (длина 6).

Шаг 3

Через третью вершину. Анализируются маршруты через вершину 3. Определяются пути: от 1 через 3 до 4 (длина 11), от 2 через 1-3 до 4 (длина 16), от 5 через 1-3 до 4 (длина 14) и от 5 через 2-1-3 до 4 (длина 17).

Шаг 4

Через четвертую вершину. Исследуются маршруты через вершину 4. Находятся пути: от 3 до 5 через 4 (длина 4), от 1 через 3-4 до 5 (длина 13) и от 2 через 1-3-4 до 5 (длина 18).

Шаг 5

Через пятую вершину. Рассматриваются все оставшиеся маршруты через вершину 5. Обнаруживаются финальные пути, включая от 1 через 5 до 4 (длина 5), от 1 через 5 до 2 (длина 4), от 1 через 2-5 до 4 (длина 8) и многие другие варианты маршрутов с различными промежуточными вершинами.