Бесплатная бета: 60 дней полного доступа, без карты.мест осталось: 84Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности

Все паттерны

Алгоритм Дейкстры

Dijkstra's algorithm

O(E log V)

Закрывайте ближайшую незакрытую вершину и ослабляйте все её рёбра. Куча держит эту вершину всегда в одном чтении от вас.

Обновлено 17 окт. 2026 г.

Алгоритм Дейкстры: как это работает?

Дайте каждой вершине расстояние бесконечность. Стартовая получает ноль.

Положите старт в кучу с ключом по расстоянию. Куча всегда отдаёт ближайшую вершину.

Снимите вершину с кучи. Если сохранённое расстояние лучше снятого, пропустите её.

Иначе вершина закрыта. Её расстояние окончательно и больше не улучшится.

Для каждого исходящего ребра сравните сохранённое расстояние с маршрутом через эту вершину. Если новый короче, запишите его и положите в кучу.

Повторяйте, пока куча не опустеет. Каждая достижимая вершина закрыта один раз.

Источники: Википедия: Алгоритм Дейкстры, Dijkstra (1959), A note on two problems in connexion with graphs (англ.)

  1. расстояния: A 0, B inf, C infТри ребра: A в B за 1, A в C за 4. Из B в C за 2.
  2. снимаем A и ослабляемB становится 1, а C становится 4.
  3. снимаем B с 1, ослабляем CНоль плюс 1 плюс 2 это 3, и это лучше 4.
  4. расстояния: A 0, B 1, C 3C кладётся в кучу заново с лучшим значением.
  5. снимаем C с 3, потом C с 4Устаревшая запись пропускается, тройка уже лучше.
Кратчайшие расстояния по Дейкстре
dijkstra(6, [[[1, 4], [2, 1]], [[3, 1]], [[1, 2], [3, 5]], [[4, 3], [5, 6]], [[5, 1]], []], 0)
число над вершиной = лучшее известное расстояние от 0
куча из пар [расстояние, вершина], ближайшая первой
начало →[0, 0]

Ищем кратчайшее расстояние от вершины 0 до каждой вершины. Все расстояния сначала ∞, вершина 0 получает 0 и попадает в кучу.

Гонка скорости
Беллман-Форд и Дейкстра на одном и том же взвешенном графе из 16 вершин

Столбики: текущее расстояние от вершины 0 до каждой вершины. Столбик во всю высоту значит, что до вершины ещё не дошли.

Одна операция: одна проверка ребра или один шаг внутри кучи. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Алгоритм Беллмана-Форда O(V·E)
операций: 0
Алгоритм Дейкстры с кучей O(E log V)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 1 000
Алгоритм Беллмана-Форда2 млн · 20 мс
Алгоритм Дейкстры с кучей14 тыс. · меньше 1 мс
n = 100 000
Алгоритм Беллмана-Форда20 млрд · 3,3 мин
Алгоритм Дейкстры с кучей2,2 млн · 22 мс
n = 10 000 000
Алгоритм Беллмана-Форда200 трлн · 23 дн.
Алгоритм Дейкстры с кучей299 млн · 3 с

Алгоритм Дейкстры: шаблон кода

function dijkstra(n, adj, source) {
    const dist = new Array(n).fill(Infinity);
    dist[source] = 0;
    const heap = [[0, source]]; // [distance, node]
    while (heap.length) {
        heap.sort((a, b) => a[0] - b[0]); // swap for a real heap in production
        const [d, u] = heap.shift();
        if (d > dist[u]) continue;
        for (const [v, w] of adj[u] || []) {
            if (d + w < dist[v]) {
                dist[v] = d + w;
                heap.push([dist[v], v]);
            }
        }
    }
    return dist;
}

Алгоритм Дейкстры: разбор примера

За сколько сигнал дойдёт до всех

Сигнал стартует в одной вершине и идёт по рёбрам с весами. Верните время, за которое он дойдёт до всех.

Если какая-то вершина недостижима, верните минус один.

Задача о сигнале это один запуск кратчайших путей из одного источника.

Ответ это наибольшее из итоговых расстояний. Недостижимая вершина оставит бесконечность.

function networkDelayTime(times, n, k) {
    const graph = new Map();
    for (const [from, to, weight] of times) {
        if (!graph.has(from)) graph.set(from, []);
        graph.get(from).push([to, weight]);
    }

    const dist = new Map([[k, 0]]);
    const heap = new MinHeap((entry) => entry[0]); // entries are [distance, node]
    heap.push([0, k]);

    while (heap.size()) {
        const [d, node] = heap.pop();
        if (d > (dist.get(node) ?? Infinity)) continue; // a stale entry

        for (const [next, weight] of graph.get(node) ?? []) {
            const candidate = d + weight;
            if (candidate < (dist.get(next) ?? Infinity)) {
                dist.set(next, candidate);
                heap.push([candidate, next]);
            }
        }
    }

    if (dist.size < n) return -1;
    return Math.max(...dist.values());
}

Алгоритм Дейкстры: когда применять?

Паттерн «Алгоритм Дейкстры» нужен, когда в условии есть слова «самый дешёвый/короткий путь со взвешенными рёбрами», «неотрицательные веса рёбер» или «минимальная суммарная стоимость до каждого узла». Решение на нём обычно укладывается в O(E log V).

  • самый дешёвый/короткий путь со взвешенными рёбрами
  • неотрицательные веса рёбер
  • минимальная суммарная стоимость до каждого узла
  • задержка в сети / стоимость маршрута, а не число дорог
  • взвешенный граф, кратчайшие пути из одного источника

Слова в условии для всех паттернов собраны в одной таблице: шпаргалка по паттернам алгоритмов.

Алгоритм Дейкстры: с чем путают?

Паттерн «Алгоритм Дейкстры» чаще всего путают с этими паттернами: Обход графа BFS / DFS, Бинарная куча / очередь с приоритетом, Жадный алгоритм (обменный аргумент) и Топологическая сортировка (алгоритм Кана).

Алгоритм Дейкстры: частые ошибки

  • Запускают на отрицательных весах

    Закрытая вершина всё ещё может улучшиться, и жадный шаг рушится. Там нужен Беллман-Форд.

  • Не пропускают устаревшие записи кучи

    Вершину кладут несколько раз с разными расстояниями. При снятии сравнивайте с сохранённым значением.

  • Закрывают вершину при вставке

    Рано положенная вершина позже может получить путь лучше. Закрывайте при снятии, а не при вставке.

  • Берут обычную очередь

    Очередь считает рёбра, а не вес. Это совпадает, только если все рёбра стоят одинаково.

Паттерн «Алгоритм Дейкстры» решает такие задачи с собеседований: Время задержки в сети, Дешёвый перелёт с k пересадками, Путь с наименьшим усилием, Плавание в поднимающейся воде, Путь с наибольшей вероятностью, Минимальная стоимость до последней клетки и Второй кратчайший путь.

  • Время задержки в сети: Чистая форма: ответ это наибольшее расстояние.
  • Дешёвый перелёт с k пересадками: Лимит пересадок добавляет к состоянию второе измерение.
  • Путь с наименьшим усилием: Стоимость пути это его худший шаг.
  • Плавание в поднимающейся воде: То же самое, но с максимумом вместо суммы.
  • Путь с наибольшей вероятностью: Здесь умножают, а не складывают, и берут наибольшее.
  • Минимальная стоимость до последней клетки: Сетка это граф с четырьмя рёбрами на клетку.
  • Второй кратчайший путь: Храните два лучших расстояния на вершину.

Алгоритм Дейкстры: сложность по времени и памяти

У паттерна «Алгоритм Дейкстры» целевая сложность O(E log V).

V вершин и E рёбер дают O(E log V) с кучей. Отрицательные веса её ломают, там нужен Беллман-Форд.

Где этот паттерн стоит в 150 шагах