Алгоритм Дейкстры, названный в честь его создателя Эдсгера Дейкстры, является фундаментальным методом в области теории графов и вычислительной математики, предназначенным для нахождения кратчайших путей в графах. Этот алгоритм широко применяется в различных областях, включая сетевые маршрутизации, географические информационные системы (ГИС), а также в задачах оптимизации и логистики.
Основной задачей алгоритма Дейкстры является нахождение кратчайшего пути от одной исходной вершины до всех остальных вершин в графе с неотрицательными весами ребер. Это делает его особенно полезным для решения задач, где важно учитывать минимальные затраты, будь то время, расстояние или другие ресурсы.
Алгоритм Дейкстры обладает несколькими ключевыми преимуществами.
- Эффективность. Алгоритм способен решать задачи поиска кратчайшего пути в графах с большим числом вершин и ребер за разумное время.
- Простота реализации. Структура алгоритма относительно проста и понятна, что делает его удобным для реализации на различных языках программирования.
- Обобщаемость. Алгоритм может быть адаптирован для решения различных задач, требующих учета минимальных затрат.
Благодаря этим преимуществам алгоритм Дейкстры находит широкое применение в различных сферах.
Маршрутизация в сетях. Оптимизация путей передачи данных в компьютерных сетях.
Навигационные системы. Определение кратчайших маршрутов на картах.
Логистика и транспорт. Оптимизация маршрутов доставки и перемещения транспорта.
Анализ социальных сетей. Изучение кратчайших связей между пользователями.
Рассмотрим два основных подхода к описанию и применению этого алгоритма: итеративный метод и табличный способ.
- Итеративный метод. В этом методе алгоритм Дейкстры реализуется путем пошагового итеративного обновления расстояний до вершин. Этот метод подробно объясняет каждый шаг алгоритма, включая выбор вершины с наименьшим текущим расстоянием, обновление расстояний до соседних вершин и повторение этого процесса до тех пор, пока не будут найдены кратчайшие пути до всех вершин.
- Табличный способ. Этот метод представляет выполнение алгоритма Дейкстры в виде таблицы, где каждая строка таблицы соответствует одной итерации алгоритма. В таблице указаны текущие расстояния до каждой вершины и предшествующие вершины на пути, что позволяет наглядно проследить процесс нахождения кратчайших путей. Этот подход структурирован и удобен для визуализации прогресса алгоритма.
Оба метода полезны для понимания и применения алгоритма Дейкстры, обеспечивая различные уровни детализации и визуализации процесса.
Задача 1.5.1. Найти кратчайший путь, используя алгоритм Дейкстры от вершины A до вершины K.

Решение. Найдем кратчайший путь от вершины A до вершины K, используя алгоритм Дейкстры, двумя способами.
Итеративный метод
В данном подходе подробно объясняется, как работает алгоритм Дейкстры. Его реализация включает в себя несколько этапов.
— Инициализация. Устанавливаются начальные расстояния до всех вершин, начальная вершина получает расстояние 0 (так как расстояния до самой себя равно нулю), а остальные — бесконечность (так как на начальном этапе, когда мы ещё не начали обход графа, расстояния до всех вершин графа неизвестны).
— Выбор текущей вершины. Выбирается вершина с минимальным известным расстоянием, которая еще не обработана.
— Обновление расстояний. Для всех соседних вершин текущей вершины проверяются и при необходимости обновляются кратчайшие расстояния.
— Повторение. Шаги повторяются до тех пор, пока не будут обработаны все вершины или не будет найден кратчайший путь до конечной вершины.
Шаг 1. Инициализация
- Создаем множество
посещённых вершин и изначально устанавливаем его пустым:
.
- Инициализируем массив расстояний
для всех вершин:
—
(расстояние до самой себя);
—
для всех остальных вершин, где
принимает значения множества вершин графа.
Таким образом, массив расстояний до вершин будет выглядеть следующим образом:
![]()
что означает
;
;
;
;
;
;
;
;
;
;
.
- Создаем массив предшественников
для отслеживания пути:
—
для всех вершин, т. е.
![]()
Под термином «предшественник» мы будем понимать предыдущую вершину.
Запись
для всех вершин означает, что на начальном этапе алгоритма Дейкстры мы устанавливаем значение предшественника для каждой вершины равным «null» (null — это стандартный термин в программировании, обозначающий отсутствие значения или неопределённое состояние). Она означает, что на начальном этапе для каждой вершины предшественник не определён, то есть мы ещё не знаем, из какой вершины мы придём в данную вершину при построении кратчайшего пути. Это необходимо для того, чтобы в дальнейшем, по мере выполнения алгоритма, обновлять значения предшественников, когда мы находим более короткие пути к вершинам.
Предшественник вершины
в нашем алгоритме указывает на вершину, из которой мы пришли в вершину
по кратчайшему пути; массив предшественников
хранит информацию о том, из какой вершины мы пришли в данную вершину при движении по кратчайшему пути. Это позволяет нам в конце работы алгоритма восстановить путь от начальной вершины до любой другой вершины, следуя от конечной точки к начальной через предшественников.
- Инициализация предшественников.
На начальном этапе, когда мы ещё не начали обход графа, для всех вершин предшественники неизвестны, поэтому их значения устанавливаются в
(или
в Python). Это означает, что на начальном этапе ни для одной вершины нет известного предшественника.
В массиве предшественников
хранится «маршрут» для каждой вершины.
Как только алгоритм Дейкстры приступает к работе, он начинает обновлять значения предшественников, когда находит более короткие пути. Например, если при обработке вершины
он обнаруживает, что можно прийти в вершину
через вершину
с определённым весом, то происходит обновление
.
Таким образом, по мере выполнения алгоритма, массив предшественников начинает заполняться конкретными значениями вершин, из которых мы приходим.
Для восстановления кратчайшего пути из стартовой вершины до какой-либо другой необходимо проследовать по массиву
от конечной вершины к начальной.
Шаг 2. Основной цикл алгоритма
Алгоритм выполняется, пока не будут посещены все вершины. На каждом шаге выбираем вершину с наименьшим известным расстоянием, обновляем расстояния до её соседей и отмечаем вершину как посещённую.
Итерация 1: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
(смежных ей вершин):
—
, так как
;
—
, так как
;
—
, так как
.
Функция
сравнивает значения входящих переменных и возвращает наименьшее.
Во множество посещенных вершин
добавляем
, и таким образом имеем
.
Предшествующей вершиной для вершин
,
и
является
:
,
,
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 2: обработка вершины]
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: уже посещена;
—
;
.
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 3: обработка вершины]
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: уже посещена;
—
;
;
—
;
.
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 4: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: уже посещена;
—
;
;
—
;
.
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 5: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: уже посещена;
—
;
;
—
: уже посещена;
—
; не обновляется.
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 6: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
, не обновляется;
—
: уже посещена;
—
;
;
—
;
.
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 7: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: посещены;
—
, не обновляется;
—
;
.
.
Обновлённые значения массивов
и
:
![]()
![]()
Итерация 8: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: посещена;
—
; не обновляется.
.
Значения массивов
и
остаются прежними:
![]()
![]()
Итерация 9: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: посещены;
не обновляет никаких значений, так как все её соседи уже обработаны.
.
Значения массивов
и
остаются прежними.
Итерация 10: обработка вершины
.
Выбираем вершину с наименьшим расстоянием:
.
Обновляем расстояния до соседей
:
—
: посещены;
не обновляет никаких значений, так как все её соседи уже обработаны.
.
Значения массивов
и
остаются прежними.
Все вершины посещены.
Теперь, когда все вершины посещены и массивы
и
заполнены, можем восстановить кратчайший путь от
до
по массиву предшественников
и узнать длину пути из массива
.
Восстановление кратчайшего пути.
- Начинаем с вершины
.
- Предшественником вершины
является вершина
.
- Предшественник
—
.
- Предшественник
—
.
- Предшественник
—
.
- Предшественник
—
.
Итак, кратчайший путь:
.
Длина кратчайшего пути:
равна
.
Таким образом, мы нашли кратчайший путь и его длину, используя итеративный метод алгоритма Дейкстры.
Табличный способ
Согласно данному способу, весь алгоритм определяется следующими шагами.
- Инициализация таблицы.
— Создается таблица, где строки соответствуют шагам алгоритма, а столбцы — вершинам графа.
— В первой строке записываются начальные расстояния от стартовой вершины до всех остальных вершин (для стартовой вершины расстояние равно нулю, так как расстояния до самой себя равно нулю, для всех остальных — бесконечности, так как на начальном этапе, когда мы ещё не начали обход графа, расстояния до всех вершин графа неизвестны).
- Выбор текущей вершины.
— В каждой строке таблицы указывается выбранная вершина, для которой будет производиться обновление расстояний. На первом шаге это стартовая вершина.
- Обновление расстояний.
— Для выбранной вершины обновляются расстояния до всех соседних вершин. Если через выбранную вершину можно пройти в соседнюю вершину с меньшим суммарным расстоянием, чем ранее записанное в таблице, то это расстояние обновляется.
— В таблице фиксируются обновленные значения расстояний.
— В таблице фиксируется общая длина пути от начальной вершины до выбранной вершины (числовая метка).
- Маркировка выбранных вершин.
— В таблице отмечается, что выбранная вершина больше не будет рассматриваться (она выбрана).
- Повторение шагов.
— Выбирается следующая вершина с наименьшим текущим расстоянием среди оставшихся невыбранных вершин.
— Процесс повторяется: обновляются расстояния, выбранная вершина отмечается как обработанная, и запись добавляется в таблицу.
- Завершение алгоритма.
— Процесс продолжается до тех пор, пока все вершины не будут выбраны или пока не будет достигнута конечная вершина (если она задана).
— В итоге таблица будет содержать кратчайшие расстояния от начальной вершины до всех других вершин и последовательность шагов для их вычисления.
Кратчайший путь определяется согласно следующему правилу: осуществляется обратный ход от конечной вершины к начальной; просматривается столбец, соответствующий конечной вершине сверху вниз и фиксируется первое появление минимального значения, определяется строка и соответствующая ей вершина, далее анализируется столбец с этой вершиной и снова определяется первое появление минимального значения, которое приводит нас к новой вершине. Повторяя этот процесс, мы приходим к начальной вершине по кратчайшему пути.
Реализация алгоритма
Шаг 0. Устанавливаются начальные расстояния до всех вершин, начальная вершина получает расстояние 0 (расстояние от самой себя равно нулю), а остальные — бесконечность (
), так как на данном этапе, когда мы ещё не начали обход графа, расстояния до всех вершин графа неизвестны, мы не знаем для них кратчайший путь от начальной вершины. Для удобства визуального восприятия все изменения также будем фиксировать на графе. Числовые метки над вершинами графа будут обозначать кратчайший путь до данной вершины от начальной.

Шаг 1. Определяем расстояния от начальной вершины A до всех остальных вершин.
Записываем в таблицу расстояния до тех вершин, с которыми она соединена (смежна, соседние вершины):
B — расстояние (длина ребра АВ, вес АВ) равно 2, обновлено, так как
;
С — 4 (вес АС), обновлено, так как
;
D — 3 (вес AD), обновлено, так как
.
Определяем расстояние до соседних вершин, сравниваем расстояния и, если необходимо, обновляем числовые метки. На данном этапе, мы определили расстояния до соседних вершин, сравнили значения и обновили числовые метки, так как новые расстояния оказались меньше прежних.
Расстояния до остальных вершин на данном этапе алгоритма остаются неизвестными, так как вершина А напрямую с ними не взаимодействует (не соединена), поэтому заполняем ячейки значением
.
Таблица 1.5.1 — Алгоритм Дейкстры, шаг 1

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

Шаг 2. Выбрана вершина В. Обновляем расстояния до соседних вершин.
Вершина В соединена с вершинами:
— А: так как А уже выбрана, то ее не рассматриваем;
— Н: 2 (числовая метка В) + 9 (вес ребра ВН) = 11. Обновляем, так как
.
При определении расстояний от вершины В до соседних вершин мы должны сложить числовую метку вершины (длину пути до данной вершины от начальной) и расстояние (длину ребра, вес) до соседней вершины.
Значения расстояний до вершин С и D переписываем с предыдущего шага, так как вершина В с ними не взаимодействует, следовательно расстояния до них от начальной вершины не обновляет.
Таблица 1.5.2 — Алгоритм Дейкстры, шаг 2

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 3. Выбрана вершина D, так как имеет минимальное значение расстояния, равное 3. Обновляем расстояния до соседних вершин.
Вершина D соединена с вершинами:
— А: так как А уже выбрана, то ее не рассматриваем;
— Е: 3 (числовая метка D) + 7 (вес ребра DЕ) = 10. Обновляем, так как
;
— F: 3 (числовая метка D) + 1 (вес ребра DF) = 4. Обновляем, так как
.
Значения расстояний до вершин С и H переписываем с предыдущего шага, так как вершина D с ними не взаимодействует, следовательно расстояния до них от начальной вершины не обновляет.
Для удобства визуального восприятия заменим в таблице знак бесконечности на прочерк.
Таблица 1.5.3 — Алгоритм Дейкстры, шаг 3

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 4. Выбрана вершина С, так как имеет минимальное значение расстояния, равное 4. Мы также можем выбрать вершину F, имеющую такое же расстояние. Порядок выбора вершин с одинаковым текущим кратчайшим расстоянием, не влияет на корректность алгоритма и на конечный результат. Поэтому можно выбрать любую вершину. Мы будем придерживаться лексикографического порядка (обрабатывать вершины согласно порядку следования по алфавиту).
Обновляем расстояния до соседних вершин.
Вершина С соединена с вершинами:
— А: так как А уже выбрана, то ее не рассматриваем;
— F: 4 (числовая метка C) + 4 (вес ребра CF) = 8. Не обновляем, так как
, предыдущая метка 4 меньше получившейся 8, т. е. попасть в вершину F можно за более короткое расстояние.
— I: 4 (числовая метка C) + 7 (вес ребра CI) = 11. Обновляем, так как
.
Значения расстояний до вершин Е и H переписываем с предыдущего шага, так как вершина C с ними не взаимодействует, следовательно расстояния до них от начальной вершины не обновляет.
Таблица 1.5.4 — Алгоритм Дейкстры, шаг 4

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 5. Выбрана вершина F, так как имеет минимальное значение расстояния, равное 4.
Обновляем расстояния до соседних вершин.
Вершина F соединена с вершинами:
— D, C: уже выбраны, не рассматриваем;
— G: 4 (числовая метка F) + 2 (вес ребра FG) = 6, обновляем, так как
;
— I: 4 (числовая метка F) + 8 (вес ребра FI) = 12, не обновляем, так как
.
Значения расстояний до вершин Е и H переписываем с предыдущего шага, так как вершина F с ними не взаимодействует, следовательно расстояния до них от начальной вершины не обновляет.
Таблица 1.5.5 — Алгоритм Дейкстры, шаг 5

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 6. Выбрана вершина G, так как имеет минимальное значение расстояния, равное 6.
Обновляем расстояния до соседних вершин.
Вершина G соединена с вершинами:
— F: уже выбрана, не рассматриваем;
— Е: 6 (числовая метка G) + 6 (вес ребра GE) = 12, не обновляем, так как
.
— J: 6 (числовая метка G) + 3 (вес ребра GJ) = 9, обновляем, так как
;
— I: 6 (числовая метка G) + 3 (вес ребра GI) = 9, обновляем, так как
.
Значение расстояния до вершины H переписываем с предыдущего шага, так как вершина G с ней не взаимодействует, следовательно расстояние до нее от начальной вершины не обновляет.
Таблица 1.5.6 — Алгоритм Дейкстры, шаг 6

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 7. Выбрана вершина I, так как имеет минимальное значение расстояния, равное 9.
Обновляем расстояния до соседних вершин.
Вершина I соединена с вершинами:
— C, F, G: посещены;
— H: 9 (числовая метка I) + 4 (вес ребра IH) = 13, не обновляем, так как
;
— K: 9 (числовая метка I) + 2 (вес ребра IK) = 11, обновляем, так как
.
Значения расстояний до вершин Е и J переписываем с предыдущего шага, так как вершина I с ними не взаимодействует, следовательно расстояния до них от начальной вершины не обновляет.
Таблица 1.5.7 — Алгоритм Дейкстры, шаг 7

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 8. Выбрана вершина J, так как имеет минимальное значение расстояния, равное 9.
Обновляем расстояния до соседних вершин.
Вершина J соединена с вершинами:
— G: посещена;
— K: 9 (числовая метка J) + 6 (вес ребра JK) = 15, не обновляем, так как
.
Значения расстояний до вершин Е и H переписываем с предыдущего шага, так как вершина J с ними не взаимодействует, следовательно расстояния до них от начальной вершины не обновляет.
Таблица 1.5.8 — Алгоритм Дейкстры, шаг 8

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 9. Выбрана вершина E, так как имеет минимальное значение расстояния, равное 10.
Обновляем расстояния до соседних вершин.
Вершина E соединена с вершинами:
— D, G: уже выбраны, не рассматриваем, следовательно вершина E не обновляет никаких значений.
Значение расстояния до вершины H переписываем с предыдущего шага, так как вершина E с ней не взаимодействует, следовательно расстояние до нее от начальной вершины не обновляет.
Таблица 1.5.9 — Алгоритм Дейкстры, шаг 9

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Шаг 10. Выбрана вершина H, так как имеет минимальное значение расстояния, равное 11.
Обновляем расстояния до соседних вершин.
Вершина H соединена с вершинами:
— B, I: уже выбраны, не рассматриваем, следовательно вершина H не обновляет никаких значений.
Таблица 1.5.10 — Алгоритм Дейкстры, шаг 10

Обновляем метки расстояний на графе и закрашиваем обработанные вершины.

Таким образом, мы проработали все вершины и определили все возможные пути до вершины К, теперь найдем кратчайший путь. Анализируем столбец, соответствующий конечной вершине К, сверху вниз и фиксируем первое появление минимального значения — это 11, которое соответствует строке вершины I; далее переходим к столбцу, который соответствует вершине I, снова просматриваем его содержимое и первое появление минимального значения соответствует строке вершины G, переходим к одноименному столбцу и повторяем процесс снова. Таким образом, следующая вершина F, далее D и A. Кратчайший путь от А до К: A, D, F, G, I, K и его длина равна 11 (отображен в ячейке таблицы с номером строки I, номером столбца K и меткой вершины К на графе).
Ответ. Расстояние между вершинами — 11; кратчайший путь, найденный согласно алгоритму Дейкстры: A, D, F, G, I, K.

Оба подхода эффективны для понимания и визуализации работы алгоритма Дейкстры, обеспечивая ясное представление о процессе поиска кратчайшего пути в графе.
Замечания
- В алгоритме Дейкстры, если у вас есть две вершины с одинаковым текущим кратчайшим расстоянием, то выбор, какую из них обрабатывать первой, не влияет на корректность алгоритма и на конечный результат (т. е. на найденные кратчайшие пути). Однако, этот выбор может повлиять на порядок обработки вершин и, следовательно, на промежуточные состояния данных.
Распространены два подхода. 1. Произвольный выбор. Обычно выбирают произвольно одну из вершин. Например, выбирают ту, которая появилась первой в наборе необработанных вершин. 2. Лексикографический порядок. В некоторых реализациях предпочитают использовать порядок вершин в графе (например, по алфавиту имен вершин или по их индексам), чтобы обеспечить определенный и предсказуемый порядок обработки.
Пример. Произвольный выбор. Пусть у нас есть две вершины
и
с одинаковым текущим кратчайшим расстоянием равным 10. Мы можем выбрать любую из них первой, например сначала выбрать
, а затем
.
Лексикографический порядок. Если мы выбираем по лексикографическому порядку (например, по алфавиту), то первой выбираем
, так как
идет перед
в алфавитном порядке.
Выбор, какую вершину обрабатывать первой при одинаковом расстоянии, может быть реализован по-разному. Важно понимать, что:
— корректность алгоритма не нарушается, алгоритм Дейкстры гарантированно найдет кратчайшие пути независимо от порядка обработки вершин с одинаковым расстоянием;
— для обеспечения предсказуемого поведения и удобства отладки часто используется лексикографический порядок или порядок добавления вершин в графе.
Таким образом, можно выбирать вершину произвольно или использовать лексикографический порядок, что в конечном итоге зависит от конкретной реализации алгоритма и требований к программе.
- В алгоритме Дейкстры обрабатывать конечную вершину не обязательно, если вы достигли её и нашли кратчайший путь. Как только вы добавили конечную вершину (в данном случае вершину
) во множество
(обработанных вершин) и обновили расстояния до всех её соседей, можно прекратить выполнение алгоритма.
Однако, алгоритм Дейкстры обычно продолжается до тех пор, пока не будут обработаны все вершины в графе. Это гарантирует, что вы нашли кратчайшие пути до всех вершин в графе от начальной вершины.
Таким образом, формально обрабатывать конечную вершину необходимо для корректного завершения алгоритма, особенно если вам нужно знать кратчайшие пути до всех вершин. Но если вы ищете только путь до конкретной конечной вершины, можно остановиться, как только путь до неё будет найден.
Задача 1.5.2. Найти кратчайший путь, используя алгоритм Дейкстры от вершины E до вершины H.

Решение.
Итеративный метод
Шаги выполнения алгоритма Дейкстры для поиска кратчайшего пути от
до
.
Исходные данные.
— Вершины и ребра с весами:
—
соединена с
(вес 4),
(вес 2),
(вес 1);
—
соединена с
(вес 4) и
(вес 9);
—
соединена с
(вес 2),
(вес 4),
(вес 7);
—
соединена с
(вес 1),
(вес 1),
(вес 7);
—
соединена с
(вес 7) и
(вес 6);
—
соединена с
(вес 1),
(вес 2),
(вес 8),
(вес 4);
—
соединена с
(вес 2),
(вес 6),
(вес 3),
(вес 7);
—
соединена с
(вес 9) и
(вес 4);
—
соединена с
(вес 7),
(вес 8),
(вес 7),
(вес 4),
(вес 2);
—
соединена с
(вес 3),
(вес 1);
—
соединена с
(вес 2),
(вес 1).
Инициализация.
— Расстояния:
![]()
— Предшественники:
![]()
— Создаем множество
посещённых вершин и изначально устанавливаем его пустым:
.
Шаги выполнения.
- Обработка вершины
.
Взаимодействие с обработанными вершинами не рассматриваем.
—
соединена с
(вес 7) и
(вес 6):
—
,
;
—
,
.
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 2),
(вес 3),
(вес 7):
—
,
;
—
,
;
—
,
.
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 1) и
(вес 1):
—
,
(обновление:
);
—
(не обновляется, так как
).
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 4),
(вес 2):
—
,
(обновление:
);
—
,
(обновление:
).
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 4),
(вес 8):
—
(не обновляется, так как
);
—
(не обновляется, так как
).
— Значения остаются прежними:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 1):
—
,
(обновление:
).
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 4) и
(вес 7):
—
(не обновляется, так как
);
—
(не обновляется, так как
).
— Значения остаются прежними:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 2):
—
,
(обновление:
).
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 9):
—
,
(обновление:
).
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
соединена с
(вес 7),
(вес 8),
(вес 7),
(вес 4):
—
,
(обновление:
).
— Обновлённые значения:
![]()
![]()
—
.
- Обработка вершины
.
—
не соединена ни с какими вершинами, которые могут улучшить пути.
—
.
Для восстановления пути от
до
необходимо проанализировать массив
, который содержит предшественников вершин.
Итак, массив
у нас следующий:
—
;
—
;
—
;
—
;
—
;
—
;
—
;
—
;
—
;
—
;
—
.
Чтобы найти путь от
до
, начнем с вершины
и будем следовать предшественникам до вершины
.
- Вершина
: предшественником вершины
является вершина
.
- Вершина
: предшественник
—
.
- Вершина
: предшественник
—
.
- Вершина
: предшественник
—
.
- Вершина
: предшественник
—
.
- Вершина
: предшественник
—
(начальная вершина).
Результат:
— кратчайший путь от
до
:
;
— общая длина пути: 16.
Табличный способ
Реализация алгоритма Дейкстры табличным способом представлена в виде таблицы 1.5.11.
Таблица 1.5.11 — Алгоритм Дейкстры

Ответ. Расстояние между вершинами — 16; кратчайший путь, найденный согласно алгоритму Дейкстры: E, G, J, K, I, H.

Задача 1.5.3. Найти кратчайший путь, используя алгоритм Дейкстры от вершины B до вершины K.

Решение.
Итеративный метод
Входные данные:
— A соединена с B (вес 4), C (вес 4), D (вес 1);
— B соединена с A (вес 4), H (вес 7);
— C соединена с A (вес 4), F (вес 4), I (вес 4);
— D соединена с A (вес 1), F (вес 5), E (вес 4);
— E соединена с D (вес 4), G (вес 6);
— F соединена с C (вес 4), D (вес 5), G (вес 1), I (вес 8);
— G соединена с E (вес 6), F (вес 1), J (вес 3), I (вес 4);
— H соединена с B (вес 7), I (вес 6);
— I соединена с C (вес 4), F (вес 8), G (вес 4), H (вес 6), K (вес 7);
— J соединена с G (вес 3), K (вес 3);
— K соединена с I (вес 7), J (вес 3).
Алгоритм Дейкстры от вершины B до вершины K.
- Начальная инициализация:
![]()
![]()
—
.
- Обработка вершины B:
—
;
— вершины, смежные с B: A (вес 4), H (вес 7);
—
,
;
—
,
;
![]()
![]()
- Обработка вершины A:
—
;
— вершины, смежные с A: B (вес 4), C (вес 4), D (вес 1);
— вершина B обработана, ее уже на рассматриваем, в дальнейшем обработанные вершины будем пропускать;
—
,
;
—
,
;
![]()
![]()
- Обработка вершины D:
—
;
— вершины, смежные с D: A (вес 1), F (вес 5), E (вес 4);
—
,
;
—
,
;
![]()
![]()
- Обработка вершины H:
—
;
— вершины, смежные с H: B (вес 7), I (вес 6);
—
,
;
![]()
![]()
- Обработка вершины C:
—
;
— вершины, смежные с C: A (вес 4), F (вес 4), I (вес 4);
—
(не обновляется, так как 8 + 4 = 12 не меньше 10);
—
,
(обновляется, так как 8 + 4 = 12 меньше 13);
![]()
![]()
- Обработка вершины E:
—
;
— вершины, смежные с E: D (вес 4), G (вес 6);
—
,
;
![]()
![]()
- Обработка вершины F:
—
;
— вершины, смежные с F: C (вес 4), D (вес 5), G (вес 1), I (вес 8);
—
,
(обновляется, так как 10 + 1 = 11 меньше 15);
—
(не обновляется, так как 10 + 8 = 18 не меньше 12);
![]()
![]()
- Обработка вершины G:
—
;
— вершины, смежные с G: E (вес 6), F (вес 1), J (вес 3), I (вес 4);
—
,
(обновляется, так как 11 + 3 = 14 меньше
);
—
(не обновляется, так как 11 + 4 = 15 не меньше 12);
![]()
![]()
- Обработка вершины I:
—
;
— вершины, смежные с I: C (вес 4), F (вес 8), G (вес 4), H (вес 6), K (вес 7);
—
,
(обновляется, так как 12 + 7 = 19 меньше
);
![]()
![]()
- Обработка вершины J:
—
;
— Вершины, смежные с J: G (вес 3), K (вес 3);
—
,
(обновляется, так как 14 + 3 = 17 меньше 19);
![]()
![]()
Все вершины обработаны, теперь необходимо установить кратчайший путь от вершины B до вершины K. Чтобы найти кратчайший путь, мы проследуем по обратным ссылкам в массиве
от K до B:
—
;
—
;
—
;
—
;
—
;
—
.
Таким образом, кратчайший путь от B до K:
; минимальная сумма весов (расстояние):
.
Табличный способ
Реализация алгоритма Дейкстры табличным способом представлена в виде таблицы 1.5.12.
Таблица 1.5.12 — Алгоритм Дейкстры

Ответ. Расстояние между вершинами — 17; кратчайший путь, найденный согласно алгоритму Дейкстры: B, A, D, F, G, J, K.
