Беллман-Форд
Кратчайшие пути с отрицательными рёбрами: V−1 проход ослабления.
1function bellmanFord(edges: Edge[], start: string): Map<string, number> {2 const dist = new Map<string, number>()3 for (const v of vertices(edges)) dist.set(v, Infinity)4 dist.set(start, 0)5 6 // V − 1 проход по ВСЕМ рёбрам7 for (let pass = 1; pass < vertices(edges).length; pass++) {8 for (const e of edges) {9 const candidate = (dist.get(e.from) ?? Infinity) + e.weight10 if (candidate < (dist.get(e.to) ?? Infinity)) {11 dist.set(e.to, candidate)12 }13 }14 }15 16 // ещё один проход: если что-то улучшается — отрицательный цикл17 for (const e of edges) {18 if ((dist.get(e.from) ?? Infinity) + e.weight < (dist.get(e.to) ?? Infinity)) {19 throw new Error('отрицательный цикл')20 }21 }22 23 return dist24}Проблема
Кратчайшие пути с отрицательными рёбрами: V−1 проход ослабления.
Что вы видите
Таблички d на узлах обновляются проход за проходом; отрицательное ребро может улучшить уже «готовое».
Как это работает
Дейкстра ломается на отрицательных весах; BF честно расслабляет все рёбра V−1 раз. Лишний проход — детектор отрицательных циклов.
Пошаговый разбор
- 01
Проход
Все рёбра по кругу.
- 02
Ослабление
Через вершину дешевле — обновляем.
- 03
Детектор цикла
Ещё проход улучшил? Цикл!
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Отрицательные рёбра: где Дейкстра сдаётся»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.