Идея. Храним текущие оценки расстояний dist: у старта 0, у остальных бесконечность. Повторяем:
- достать из очереди с приоритетом вершину
v с наименьшим dist; - для каждого ребра
v → u с весом w: если dist[v] + w < dist[u], обновить dist[u] и положить u в очередь (это называется ослаблением ребра); - запоминать родителя, чтобы восстановить путь.
Почему это верно. Все веса неотрицательны, поэтому вершина, у которой сейчас наименьшая оценка, не может получить ещё меньшую через другие вершины — любой обходной путь только длиннее. Значит, в момент извлечения её расстояние окончательное. Это «жадный» шаг.
Отрицательные веса ломают рассуждение: обходной путь через отрицательное ребро может оказаться короче уже «окончательного». Для них используют алгоритм Беллмана — Форда (O(V·E)), он же находит отрицательные циклы.
Сложность с двоичной кучей — O((V + E) log V). Для невзвешенного графа Дейкстра вырождается в BFS. Если нужен путь до одной конкретной цели, можно остановиться, когда цель извлечена из очереди, а ещё лучше — использовать A* с эвристикой.
Применения: маршрутизация в сетях (OSPF), навигация, стоимость перемещения в играх.