Все статьи и конспекты
ДейкстраБеллман-ФордКратчайшие путиГрафы
2 мин чтение

Кратчайшие пути в графах: Дейкстра, Беллман-Форд и поиск в DAG

Теория ослабления (релаксации) ребер и 6 фундаментальных свойств. Кратчайшие пути в DAG за O(V+E). Алгоритм Дейкстры с кучей за O((V+E) log V). Алгоритм Беллмана-Форда с детектированием отрицательных циклов.

Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.

Процедура релаксации (Relaxation)

cpp
void relax(int u, int v, int w, vector<int>& d, vector<int>& p) {
    if (d[v] > d[u] + w) {
        d[v] = d[u] + w;
        p[v] = u;
    }
}

6 фундаментальных свойств кратчайших путей:

  • Неравенство треугольника: δ(s,v)≤δ(s,u)+w(u,v)\delta(s, v) \le \delta(s, u) + w(u, v);
  • Свойство верхней границы: d[v]≥δ(s,v)d[v] \ge \delta(s, v) всегда;
  • Свойство сходимости: если u→vu \to v на кратчайшем пути и d[u]=δ(s,u)d[u] = \delta(s, u), то после релаксации (u,v)(u, v) получаем d[v]=δ(s,v)d[v] = \delta(s, v);
  • Свойство отсутствия пути: если пути нет, d[v]=∞d[v] = \infty;
  • Свойство ослабления пути;
  • Свойство подграфа предшествования.

  • 1. Алгоритм Дейкстры: O((V+E)log⁡V)O((V + E) \log V) (для w≥0w \ge 0)

    cpp
    vector<int> dijkstra(int s, int n, const vector<vector<pair<int, int>>>& adj) {
        vector<int> dist(n, 1e9);
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
        dist[s] = 0;
        pq.push({0, s});
        while (!pq.empty()) {
            auto [d, u] = pq.top(); pq.pop();
            if (d > dist[u]) continue;
            for (auto [v, w] : adj[u]) {
                if (dist[u] + w < dist[v]) {
                    dist[v] = dist[u] + w;
                    pq.push({dist[v], v});
                }
            }
        }
        return dist;
    }

    2. Алгоритм Беллмана-Форда: O(V⋅E)O(V \cdot E)

    Выполняет V−1V-1 итерацию релаксации всех ребер. Если на VV-м проходе какое-то расстояние уменьшается — в графе есть цикл отрицательного веса!

    Что дальше?

    Закрепите материал задачей: Повторить число.

    Изучено — к практике →

    Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».