Программа курса:
Разбор задачи: Все пути от источника к цели
Предложенный нами код:
def allPathsSourceTarget(graph, i = 0, q = [0]):
if i == 0:
global res
res = []
if i == len(graph) - 1:
res.append(q)
for index in graph[i]:
allPathsSourceTarget(graph, index, q + [index])
return resРассмотрим предложенный код, который решает задачу поиска всех путей от узла 0 до узла n−1n-1 в направленном ациклическом графе. Решение основано на рекурсивном подходе.
Код функции
def allPathsSourceTarget(graph, i = 0, q = [0]):
if i == 0:
global res
res = []
if i == len(graph) - 1:
res.append(q)
for index in graph[i]:
allPathsSourceTarget(graph, index, q + [index])
return res
Разбор фрагментов кода
Объявление функции с аргументами по умолчанию:
def allPathsSourceTarget(graph, i = 0, q = [0]):graph: список смежности, задающий граф. Каждый элементgraph[i]— это список вершин, в которые есть ребро из вершиныi.i: текущий узел, с которого начинается поиск. По умолчанию это узел0.q: текущий путь, по которому проходит рекурсивная функция. По умолчанию содержит только узел0.
Инициализация глобальной переменной
res:if i == 0: global res res = []- При первом вызове функции (
i == 0) создается глобальная переменнаяres, которая будет хранить все найденные пути.
- При первом вызове функции (
Условие окончания пути:
if i == len(graph) - 1: res.append(q)- Если текущий узел
iявляется последним узлом графа (целевым узлом), текущий путьqдобавляется в результат.
- Если текущий узел
Рекурсивный обход графа:
for index in graph[i]: allPathsSourceTarget(graph, index, q + [index])- Цикл перебирает все узлы, в которые можно перейти из текущего узла
i. - Для каждого узла выполняется рекурсивный вызов, при этом к текущему пути
qдобавляется узелindex.
- Цикл перебирает все узлы, в которые можно перейти из текущего узла
Возврат результата:
return res- В конце возвращается глобальная переменная
res, содержащая список всех найденных путей.
- В конце возвращается глобальная переменная
Пример работы алгоритма
Рассмотрим пример:
graph = [[1, 2], [3], [3], []]
result = allPathsSourceTarget(graph)
- Инициализация:
res = [](пустой список для хранения результатов).i = 0(стартуем с узла0).q = [0](текущий путь содержит только стартовый узел).
- Рекурсивные вызовы:
- Узел
0ведет к узлам1и2.- Для узла
1:- Текущий путь:
[0, 1]. - Узел
1ведет к узлу3:- Текущий путь:
[0, 1, 3]. - Добавляем путь в
res.
- Текущий путь:
- Текущий путь:
- Для узла
2:- Текущий путь:
[0, 2]. - Узел
2ведет к узлу3:- Текущий путь:
[0, 2, 3]. - Добавляем путь в
res.
- Текущий путь:
- Текущий путь:
- Для узла
- Узел
- Результат:
res = [[0, 1, 3], [0, 2, 3]].
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии