Кратчайшие пути: Дейкстра и Флойд

Кратчайшие пути во взвешенном графе: Дейкстра с кучей за O(m log n) и Флойд за O(n³).

Когда у рёбер появляются веса (длины дорог, стоимости), BFS уже не работает. Два главных инструмента: • Дейкстра — кратчайшие пути от одной вершины до всех, O(m log n) с приоритетной очередью. Ограничение: веса неотрицательны. • Флойд — кратчайшие пути между ВСЕМИ парами, O(n³), пять строк кода. Годится при n до нескольких сотен. Идея Дейкстры: поддерживаем текущие лучшие расстояния и всегда «закрываем» ближайшую из открытых вершин — при неотрицательных весах её расстояние уже никогда не улучшится.

Дейкстра. Введите: 5 6, затем рёбра «a b вес»: 1 2 2, 1 3 5, 2 3 1, 2 4 4, 3 5 1, 4 5 3

Ключевая строка — if (d > dist[v]) continue: в очереди могут лежать устаревшие записи (мы кладём вершину повторно при каждом улучшении), и их надо молча пропускать. Без этой строки алгоритм остаётся верным, но может сильно замедлиться. Флойд ещё проще: три вложенных цикла, внешний — по «промежуточной» вершине k. После итерации k массив d[i][j] хранит кратчайшие пути, использующие промежуточные вершины только из {1..k}.

Флойд: все пары. Введите: 4 4, затем: 1 2 5, 2 3 3, 3 4 1, 1 3 10

Для отрицательных рёбер (без отрицательных циклов) существует алгоритм Беллмана-Форда за O(n·m) — познакомьтесь с ним самостоятельно, когда встретите такую задачу. Задание: в примере Дейкстры проверьте руками, что расстояние до вершины 4 равно 6, а до 5 — 4, проследив пути. Отметьте урок пройденным и переходите к минимальному остову.
Доска