Algolume

Дейкстра: Поиск кратчайших путей

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

Формат входных данных: В первой строке заданы два числа: n и m (1 ≤ n, m ≤ 100,000) – количество вершин и количество рёбер соответственно. В следующих m строках заданы тройки целых чисел v, u и w (1 ≤ u, v ≤ n, 0 ≤ w ≤ 1e9), обозначающие ребро между вершинами v и u с весом w. Если граф неориентированный, каждое ребро нужно добавить в список смежности обеих вершин. Последняя строка содержит одно число s – номер стартовой вершины.

Формат выходных данных: В первой строке выведите расстояния до каждой вершины (или некоторую метку, если вершина недостижима). В следующих n строках можно вывести пути от стартовой вершины до каждой посещённой вершины, восстанавливая их по массиву parent.

Решение: Для решения задачи используется алгоритм Дейкстры. Создаётся массив dist, где dist[v] хранит текущее известное кратчайшее расстояние от стартовой вершины до v. Массив parent позволяет восстановить путь. В реализации обычно используется очередь с приоритетами (heapq в Python).

Начальное условие:

dist = [∞] * n

parent = [-1] * n

Устанавливаем dist[start] = 0, помещаем стартовую вершину в приоритетную очередь. Далее, пока очередь не пуста, извлекаем вершину с наименьшим расстоянием, и пытаемся улучшить расстояния до её соседей.

После выполнения алгоритма в dist[v] будет кратчайшее расстояние от start до v (или ∞, если вершина недостижима). Для восстановления пути используем parent:

Визуализируйте алгоритм! (Python3)

Для стабильной работы визуализации, ограничения на входные данные следующие: 1 ≤ n ≤ 15.

Логическое название Название переменной
graph
parent
dist