# конспект · шаг 1 из 1
Конспект раздела: кратчайшие пути и остовные деревья
Понятия
Вес ребра - число на нём; длина пути - сумма весов; dist[v] - текущая оценка сверху
на расстояние от старта; prev[v] - предыдущая вершина в найденном пути (по ней путь
разворачивается назад).
Релаксация - единственная операция всех алгоритмов этого раздела:
если dist[u] + w(u, v) < dist[v]: dist[v] = dist[u] + w(u, v); prev[v] = u
Алгоритмы кратчайших путей отличаются только ПОРЯДКОМ релаксаций (остовы раздела строятся иначе - по
свойству разреза). dist[v] всё время остаётся длиной какого-то
реального пути, поэтому оценка не бывает меньше правды.
Оптимальность подпути - любой участок кратчайшего пути сам кратчайший; из неё следует, что
дерево путей prev существует и что релаксации хватает.
Отрицательный цикл, достижимый из старта и ведущий к цели, - кратчайшего пути нет вовсе: длину можно уменьшать бесконечно. Отсюда две разные постановки - «кратчайший путь» и «простой путь наименьшего веса» (вторая NP-трудна).
Эвристика h(v) - дешёвая оценка остатка до цели. Допустимая: h(v) <= d(v, цель).
Согласованная: h(u) <= w(u, v) + h(v) и h(цель) = 0.
Остовное дерево - связный подграф без циклов на всех V вершинах, ровно V − 1 ребро;
минимальное (МОД) - наименьшего суммарного веса. Разрез - разбиение вершин на две непустые
части.
Что унести
Выбор алгоритма кратчайших путей - это выбор по весам, а не по вкусу:
| случай | инструмент | цена |
|---|---|---|
| все веса равны | обход в ширину | O(V + E) |
| веса только 0 и 1 | обход с декой | O(V + E) |
| небольшие неотрицательные целые веса | очередь-ведра (Дийл) | O(V·C + E) |
| неотрицательные веса, разрежённый граф | Дейкстра на куче | O((V + E)·log V) |
| неотрицательные веса, плотный граф | Дейкстра перебором массива | O(V²) |
| есть отрицательные веса | Беллман-Форд | O(V·E) |
| нужно ПОЙМАТЬ отрицательный цикл | Беллман-Форд, V-я итерация |
O(V·E) |
| граф ациклический (любые веса) | релаксация в топологическом порядке | O(V + E) |
| все пары, плотный граф | Флойд-Уоршелл | Θ(V³) |
| все пары, разрежённый граф с минусами | Джонсон | O(V·E·log V) |
| один путь и хорошая оценка остатка | A* | как Дейкстра, но раскрытий меньше |
Неотрицательность весов нужна Дейкстре ровно в одном месте доказательства - «остаток пути
>= 0, значит извлечённая вершина окончательна». С минусом это место рушится, и вершину приходится
открывать заново.
Три приёма, которые сводят задачу к уже решённой:
A* = Дейкстра при w'(u,v) = w(u,v) + h(v) − h(u) (согласованность ⇔ w' ≥ 0)
Джонсон = Дейкстра при w'(u,v) = w(u,v) + p(u) − p(v) (потенциалы p - от Беллмана-Форда)
длиннейший путь в DAG = кратчайший при отрицанных весах
Оба перевеса меняют длину любого пути u → v на одну и ту же величину, поэтому порядок путей
сохраняется, а отрицательные веса исчезают.
Флойд-Уоршелл - это динамика по разрешённым промежуточным вершинам, и внешний цикл обязан быть по
k: три строки в другом порядке дают неверный ответ, хотя программа выглядит так же. Диагональ
после прогона показывает отрицательные циклы.
Минимальные остовные деревья - одна теорема и три способа её применить:
| алгоритм | какой разрез берёт | цена |
|---|---|---|
| Прим на куче | дерево против остального | O((V + E)·log V) |
| Прим перебором массива | то же | O(V²) |
| Крускал | компонента конца ребра против остального | O(E·log E) |
| Борувка | все компоненты сразу, потому и параллелится | O(E·log V) |
Свойство разреза доказывается обменом: добавили лёгкое ребро - появился ровно один цикл, в нём есть другое ребро через тот же разрез, выбросили его, вес не вырос. Свойство цикла - обратная сторона: самое тяжёлое ребро цикла можно не брать. При различных весах МОД единственно.
Главная путаница раздела - в одном слагаемом. best[u] = wt[j] строит остов, а
best[u] = best[v] + wt[j] - дерево кратчайших путей. Код почти одинаковый, деревья разные.
Тихие ошибки, которые собирал этот раздел: остановиться, когда цель попала в очередь, а не когда
извлечена; «исправить» Дейкстру под минусы прибавлением константы (она умножает добавку на число
рёбер и меняет ответ); релаксировать в Беллмане-Форде без флага «изменилось ли» и терять раннюю
остановку; забыть h(цель) = 0; взять «расстояние по прямой» там, где вес - цена, а не длина;
ждать МОД от несвязного графа (там остовный лес).
Куда это ведёт
Дальше - потоки, паросочетания и линейное программирование. К весам добавятся пропускные способности, а жадный шаг научится ОТКАТЫВАТЬСЯ: обратное ребро остаточной сети - это разрешение передумать, которого не было ни у Дейкстры, ни у Крускала.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий