Путь в ориентированном графе можно найти DFS или BFS, сохраняя предка каждой достигнутой вершины. BFS также найдёт кратчайший путь по числу рёбер.
Дан массив однонаправленных дорог (граф), гарантируется отсутствие циклов. Каким способом можно добраться из пункта 1 в пункт N?
Путь в ориентированном графе можно найти 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); сохранение посещённых вершин исключает повторный обход общих потомков даже в ациклическом графе.