Дан массив однонаправленных дорог (граф), гарантируется отсутствие циклов. Каким способом можно добраться из пункта 1 в пункт N?

Путь в ориентированном графе можно найти DFS или BFS, сохраняя предка каждой достигнутой вершины. BFS также найдёт кратчайший путь по числу рёбер.

Короткий ответ

Что ответить на собеседовании

Путь в ориентированном графе можно найти DFS или BFS, сохраняя предка каждой достигнутой вершины. BFS также найдёт кратчайший путь по числу рёбер.

Подробный разбор

Ответ с пояснениями

Путь в ориентированном графе можно найти DFS или BFS, сохраняя предка каждой достигнутой вершины. BFS также найдёт кратчайший путь по числу рёбер.

Ниже edges — пары [from, to], вершины нумеруются с 1. Возвращается один путь либо null.

function findPath(n, edges) {
  const graph = new Map();
  for (const [a, b] of edges) {
    if (!graph.has(a)) graph.set(a, []);
    graph.get(a).push(b);
  }
  const parent = new Map([[1, null]]);
  const queue = [1];
  for (let head = 0; head < queue.length && !parent.has(n); head++) {
    const v = queue[head];
    for (const to of graph.get(v) ?? []) {
      if (parent.has(to)) continue;
      parent.set(to, v);
      queue.push(to);
    }
  }
  if (!parent.has(n)) return null;
  const path = [];
  for (let v = n; v !== null; v = parent.get(v)) path.push(v);
  return path.reverse();
}

Время и память O(V + E); сохранение посещённых вершин исключает повторный обход общих потомков даже в ациклическом графе.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее