Files
eduplan-cpp-eltex/diag/tasks/12_dijkstra/task.md
T

1.3 KiB
Raw Blame History

Задача 12 — Дейкстра на priority_queue (C++)

long long shortest_path(int n,
                        const std::vector<std::tuple<int,int,int>>& edges,  // (u, v, w)
                        int src, int dst);

Требования:

  • рёбра ориентированные, вес w >= 0, self-loop допустим; вершины 0..n-1;
  • вернуть длину кратчайшего пути src -> dst (long long, веса суммируются до 10^9);
  • недостижимость → -1; src == dst → 0;
  • вес рёбер 0 допустим (условие применимости Дейкстры — неотрицательные веса);
  • 100 000 вершин и 200 000 рёбер: быстрее 2 секунд. Значит нужна std::priority_queue (O((V+E) log V)), а не O(V²) перебор минимума.

Подсказки по разбору (после сдачи): «ленивое» удаление устаревших записей из очереди (if (d != dist[v]) continue;), почему нельзя Дейкстру с отрицательными рёбрами и когда нужен Беллман–Форд.

Проверка: python3 grade.py 12. Критерий: все ok, сборка без предупреждений.