21 дек 2024
6 минут

Количество разных путей между вершинами графа

Задача № 9 ОГЭ по информатике

В этой задаче нам дан направленный ненагруженный граф. Направленный граф ещё называется ориентированным или орграфом. А ненагруженный или невзвешенный — значит, что его связям не назначены числа — веса.

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

Граф может выглядеть, например, так:

Этот граф взят из задачи ФИПИ
Этот граф взят из задачи ФИПИ

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

Суть динамического программирования в том, что для вычисления значений на каждом следующем этапе мы используем значения, сохранённые на предыдущем.

Например, для вычисления факториала числа n этим методом мы могли бы заполнить таблицу:

Таблица для расчёта n! при помощи динамического программирования
Таблица для расчёта n! при помощи динамического программирования

Напомню, что факториал n! = 1 * 2 * 3 *… * n. Видно, что для получения каждого следующего результата мы умножаем текущее n (сиреневое) на результат n! предыдущего шага (это показано синими стрелками).

Давайте посмотрим, как мы можем использовать динамическое программирование для поиска количества путей в графе. Найдём количество разных путей между вершинами А и F.

1) В начальную вершину А мы можем попасть единственным путём: просто оказаться там. Значит в А ведёт один возможный путь. Отметим его возле начальной вершины.

Ставим единицу возле начальной вершины
Ставим единицу возле начальной вершины

2) Теперь на каждой связи, выходящей из А, запишем число, равное сумме чисел, входящих в А (то есть везде единицы).

Какая сумма «вошла» в вершину, такая должна и «выйти» по всем стрелкам, ведущим из неё
Какая сумма «вошла» в вершину, такая должна и «выйти» по всем стрелкам, ведущим из неё

3) То же самое повторим для всех следующих вершин: на связях, выходящих из вершины, будем писать число, равное сумме чисел на связях, входящих в эту вершину.

Например, в D входит одна единица, значит у связи D-E ставим тоже единицу. А вот в Е теперь входят две связи с единицами, значит на связях Е-G и E-H поставим двойки.

И так до конца. Главное: для каждой вершины нам уже должны быть известны числа входящих в неё связей.

Дальше рисуем по той же схеме: сколько вошло — столько же вышло
Дальше рисуем по той же схеме: сколько вошло — столько же вышло

4) А теперь самое вкусное. Посчитаем сумму чисел всех связей, входящих в последнюю вершину F и — вуаля! Мы получили готовый ответ:

В финале не нужно никаких дополнительных действий — просто получаем сумму-результат
В финале не нужно никаких дополнительных действий — просто получаем сумму-результат


ДОПОЛНИТЕЛЬНЫЕ УСЛОВИЯ

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

В нашем случае пропадут связи А-D, D-E и D-G. Все остальные останутся «рабочими».

Вычёркиваем связи, по которым нельзя проходить
Вычёркиваем связи, по которым нельзя проходить

Осталось расставить числа, как мы это делали раньше:

А дальше рассчитываем по прежней схеме
А дальше рассчитываем по прежней схеме

Видите? Теперь из Е выходит сумма 1, потому что связь D-E нерабочая. А в G суммируются три связи, а не четыре. И результат получился 5.

Для задач с дополнительными условиями результат всегда получится меньше, чем для простой задачи на том же графе.


Теперь пусть мы, наоборот, обязаны пройти через вершину D. Значит, нам нужно вычеркнуть все связи, пройдя через которые мы в D не попадаем.

Например, A-C и следующая C-G: из вершины С нам уже никак не вернуться в D. То же для A-B и затем B-F.

A-E вычёркиваем, но сама вершина Е будет работать, ведь мы можем попасть в неё из D и пойти дальше — в Н и G.

Противоположное условие, а действия те же: вычёркиваем связи, по которым нельзя проходить
Противоположное условие, а действия те же: вычёркиваем связи, по которым нельзя проходить

Расставим числа-суммы как раньше.

Расчёт проводим по прежней схеме
Расчёт проводим по прежней схеме

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

Теперь вы точно знаете, как решать задачу № 9 из ОГЭ по информатике. Осталось потренироваться!


Бесплатный
Комментарии
Здесь будут комментарии к публикации