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

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

Полевой справочник

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

O(E log V)

Храним лучшую известную стоимость для каждого узла, на каждом шаге фиксируем самый дешёвый ещё не зафиксированный узел и релаксируем его рёбра, снижая стоимость соседей. Поскольку все веса неотрицательны, стоимость узла становится окончательной в момент его фиксации.

Сигналы

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

Шаблон

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;
}

Похоже, но не то

  • Обход графа BFS / DFS: BFS считает шаги в невзвешенном графе, считая все рёбра одинаковыми по цене. Дейкстра нужен для взвешенных неотрицательных рёбер, где три дешёвых ребра могут обойти два дорогих, поэтому просто число рёбер здесь не ответ.

V, E до ~1e5, неотрицательные веса рёбер, нужен самый дешёвый путь, а не минимум рёбер -> O(E log V) с мин-кучей, фиксирующей один узел за извлечение.

Изучить этот паттерн