Задача: Дан неориентированный (или ориентированный) взвешенный граф, представленный списком смежности. Необходимо найти кратчайшие расстояния от заданной стартовой вершины до всех остальных вершин, используя алгоритм Дейкстры.
Формат входных данных:
В первой строке заданы два числа: 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: