Односторонние трамваи: минимум поездок

тема: BFS/DFS · уровень: средний

Условие

В городе трамваи ходят по односторонним путям между остановками. За одну поездку можно проехать ровно по одному пути (из остановки u в остановку v).

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

Формат ввода

В первой строке два целых числа n и m — количество остановок и количество односторонних путей. Далее в m строках записаны пары u v — есть путь из u в v. В последней строке два целых числа s и t.

Остановки пронумерованы от 1 до n.

Формат вывода

Выведите одно целое число:

Ограничения

Пример

Ввод:

5 6
1 2
2 3
3 5
1 4
4 5
2 4
1 5

Вывод:

2

Как решать — идея подхода

Приём: BFS (поиск в ширину) в ориентированном графе

Здесь каждая «поездка» — это проход по одному одностороннему пути, то есть по одному ребру графа. Все рёбра имеют одинаковую цену 1, значит минимальное число поездок — это кратчайшее расстояние по числу рёбер от s до t.

Для таких задач работает BFS (поиск в ширину): он идёт «слоями» — сначала все вершины на расстоянии 1, потом на расстоянии 2 и т.д. Поэтому первая найденная дистанция до вершины и есть минимальная.

План:

Мини-сниппет ключевого перехода: dist[v] = dist[u] + 1.

Сложность: O(n + m) по времени и O(n + m) по памяти — укладывается при n, m до 8000.

Частая ошибка: запускать DFS или пытаться «жадно» выбирать следующий путь — они не гарантируют минимум. В BFS важно помечать вершину посещённой сразу при добавлении в очередь, иначе можно положить её туда много раз.

Решить задачу с автопроверкой на Python →

Куда дальше