Расстояние в графах (11 ноября 2016, Лёша)
- Поиск в ширину (bfs): поиск расстояния от одной вершины до всех в невзвешенном графе
- Вариант на двух очередях (вершины расстояния D, вершины расстояния D+1)
- Вариант на одной очереди
- Восстановление пути
- Дейкстра: поиск расстояния от одной вершины до всех во взвешенном графе с неотрицательными весами
- Описание алгоритма
- Вариант реализации за Θ(n2 + m) (в лоб)
- Вариант реализации за Θ((n + m) log n) (с кучей)
- Восстановление пути
- Флойд: поиск расстояния между всеми парами вершин во взвешенном графе с произвольными весами, без отрицательных циклов
- Реализация за Θ(n3)
- Обоснование корректности (динамика с инвариантом "учтены все пути из i в j, проходящие через вершины 1..k")
- Восстановление пути
- [skipped] (можно выкинуть, особо не нужно) Поиск отрицательного цикла Флойдом
Расстояние в графах (18 ноября 2016, Паша)
- Форд-Беллман: поиск расстояния от одной вершины до всех во взвешенном графе с произвольными весами, без отрицательных циклов
- Реализация за O(nm)
- Реализация с очередью, O(n) памяти и O(m) времени в среднем (не путать с алгоритмом Левита!)
- Поиск отрицательного цикла Форд-Беллманом
- Алгоритм за O(nm)
- Доказательство корректности
- Lm #1: В каждый момент времени d[v] ≥ d[e[v].begin] + e[v].weight
- Lm #2: Ссылки циклятся
- Lm #3: Любой цикл на ссылках имеет отрицательный вес
- Потенциалы, алгоритм Джонсона: поиск расстояния между всеми парами вершин во взвешенном графе с произвольными весами
- Идея потенциалов
- Алгоритм за O(nmlogn)
- (займёт минут 5) Анонс возможных улучшений
- Фибоначчиева куча даёт Дейкстре O(m + nlogn), Джонсону O(nm + n2logn)
- Алгоритм Гольдберга ищет потенциалы быстрее Форд-Беллмана: за O(m√ n logN)
- В неориентированном графе с неотрицательными весами умеют искать кратчайший путь между двумя выделенными вершинами за O(n + m)