РУҚА
Задания № 8, 27 · ЕГЭ

Задачи на количество путей

Как находить число маршрутов в ориентированном графе без перебора всех вариантов
6 мин чтенияСложность: Обновлено 29 сентября 2026

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

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

Сначала повторите, что такое ориентированный граф: его рёбра имеют направление, например \(A \to B\). По ребру можно двигаться только от \(A\) к \(B\), но не обратно. Путь из вершины \(S\) в вершину \(T\) — последовательность рёбер, по которым можно пройти от \(S\) к \(T\). В школьных задачах обычно считают маршруты в ориентированном графе, заданном рисунком, таблицей или описанием переходов.

D
Путь и количество путей

Путь — последовательность вершин, в которой каждая следующая вершина соединена с предыдущей направленным ребром. Количество путей между \(S\) и \(T\) — число различных последовательностей переходов от \(S\) к \(T\). Если граф не содержит циклов, это число конечно.

Не путайте путь с простым путём. В задачах на подсчёт маршрутов иногда разрешается проходить через одну вершину несколько раз, а иногда явно сказано, что повторения запрещены. Если граф ацикличен, повторений всё равно быть не может, поэтому задача особенно удобно решается динамически.

T
Правило сложения

Если последний переход в вершину \(V\) может быть выполнен из вершин \(U_1, U_2, \ldots, U_k\), то число путей из \(S\) в \(V\) равно сумме количеств путей в эти вершины.

\[F(V)=F(U_1)+F(U_2)+\cdots+F(U_k)\]

Здесь \(F(X)\) обозначает число путей из начальной вершины \(S\) в вершину \(X\). Начальное значение: \(F(S)=1\). Это означает, что существует один пустой маршрут, который уже находится в \(S\). Для любой вершины, в которую нет пути из \(S\), значение равно нулю.

Динамическое программирование на графе

Динамическое программирование использует уже найденные ответы для более простых подзадач. В ацикличном графе вершины можно обрабатывать слева направо — от старта к финишу. Если порядок неочевиден, помогает топологическая сортировка: каждая дуга направлена из более ранней вершины в более позднюю.

  1. Выберите начальную вершину \(S\) и положите \(F(S)=1\).
  2. Для остальных вершин сначала установите \(F(V)=0\).
  3. Обрабатывайте вершины в порядке от старта к финишу.
  4. Для каждой дуги \(U \to V\) прибавляйте \(F(U)\) к \(F(V)\).
  5. В конце ответом будет \(F(T)\) для конечной вершины \(T\).
\[F(V)=\sum_{U\to V}F(U)\]

Эта формула смотрит на входящие рёбра. Можно использовать и обратный вариант: обозначить \(G(V)\) как число путей из \(V\) в конечную вершину \(T\). Тогда \(G(T)=1\), а для остальных вершин значение равно сумме по исходящим рёбрам.

\[G(V)=\sum_{V\to W}G(W)\]
Как выбрать направление подсчёта

Если на рисунке удобно двигаться от старта к финишу, считайте \(F\). Если удобно начинать с финишной вершины и идти против стрелок, считайте \(G\). Оба способа дают один и тот же ответ.

Микро-проверка

В графе в вершину \(X\) ведут три пути из \(S\), а в вершину \(Y\) — пять. Из \(X\) и \(Y\) есть рёбра в \(Z\), других входящих рёбер в \(Z\) нет. Сколько путей из \(S\) в \(Z\)?

Разобранный пример

Рассмотрим граф с вершинами \(S,A,B,C,D,T\) и дугами \(S\to A\), \(S\to B\), \(A\to C\), \(A\to D\), \(B\to C\), \(C\to D\), \(C\to T\), \(D\to T\). Требуется найти количество путей из \(S\) в \(T\).

SABCDT
Ориентированный граф для примера; стрелки направлены слева направо.
1
В начальной вершине находится один исходный маршрут.
F(S)=1
2
В A можно попасть только из S, а в B — только из S.
\(\displaystyle F(A)=F(S)=1,\quad F(B)=F(S)=1\)
3
В C ведут рёбра из A и B, поэтому складываем количества путей.
F(C)=F(A)+F(B)=1+1=2
4
В D ведут рёбра из A и C.
F(D)=F(A)+F(C)=1+2=3
5
В T ведут рёбра из C и D.
F(T)=F(C)+F(D)=2+3=5
№
Ответ к примеру

Из \(S\) в \(T\) существует 5 путей. Их можно проверить перечислением: \(S-A-C-T\), \(S-B-C-T\), \(S-A-D-T\), \(S-A-C-D-T\), \(S-B-C-D-T\). Перечисление удобно как проверка, но для больших графов оно становится слишком длинным.

Как считать по таблице и графу переходов

В экзаменационных задачах граф часто скрыт в таблице: строка обозначает текущую вершину, столбец — следующую, а единица означает разрешённый переход. Иногда вершины — это состояния, пункты, клетки или наборы параметров. Такой объект удобно рассматривать как граф переходов.

Для каждой строки определите, куда можно перейти. Затем перенесите число способов из текущего состояния во все достижимые состояния. Если один переход можно выполнить несколькими способами, его вклад умножается на число вариантов перехода.

\[F(V)=\sum_{U}F(U)\cdot m_{UV}\]

Здесь \(m_{UV}\) — число различных переходов из \(U\) в \(V\). В обычном графе без кратных рёбер \(m_{UV}\) равно либо \(0\), либо \(1\).

Для задач на клетки сетки часто разрешены движения только вправо и вниз. Тогда число маршрутов в клетку \((i,j)\) равно сумме числа маршрутов в клетку сверху и в клетку слева. Такой граф автоматически ацикличен, поэтому клетки можно обрабатывать построчно и слева направо.

\[F(i,j)=F(i-1,j)+F(i,j-1)\]

Когда появляются циклы

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

!
Частые ошибки

<ul><li>Считать только вершины, а не маршруты: разные последовательности переходов могут проходить через одни и те же вершины.</li><li>Забывать, что стрелка односторонняя.</li><li>В начальной вершине ставить \(0\) вместо \(1\).</li><li>Перемножать числа там, где нужно сложение. Если маршрут выбирает один из нескольких вариантов последнего шага, количества складываются.</li><li>Обрабатывать вершину раньше, чем подсчитаны все её предшественники.</li><li>Не замечать цикл и получать конечное число там, где разрешены повторные обходы.</li></ul>

Запомните

Для ацикличного ориентированного графа: стартовая вершина — 1, недостижимая — 0, в каждой следующей вершине складываем значения всех предшественников.

Алгоритм и проверка результата

Если граф задан списком рёбер, можно применять следующий универсальный алгоритм: построить порядок вершин от старта к финишу, записать единицу в стартовой вершине, затем пройти все рёбра в этом порядке. Время работы пропорционально числу вершин и рёбер, то есть перебор всех маршрутов не требуется.

Псевдокод
для всех вершин V: F[V] := 0
F[S] := 1
для вершин U в порядке от S к T:
    для каждого ребра U -> V:
        F[V] := F[V] + F[U]
вывести F[T]

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

Q
Быстрый тест по теме

Быстрая проверка

~ 2 мин4 вопроса
Вопрос 1 / 4
Вопрос 1 из 4 · база динамического программирования
Какое начальное значение обычно устанавливают для числа путей в стартовой вершине?
Главное за минуту

Главное

  • Ориентированное ребро разрешает движение только в указанном направлении.
  • Для подсчёта путей в ацикличном графе используйте динамическое программирование.
  • База: \(F(S)=1\); переход: значение вершины равно сумме значений всех её предшественников.
  • В таблицах и графах переходов учитывайте все разрешённые переходы, а при кратных переходах — их количество.
  • При наличии циклов сначала выясните, разрешены ли повторения: число маршрутов может быть бесконечным.
  • Не путайте сложение вариантов последнего шага с умножением последовательных независимых выборов.