2 вещи:
В настоящее время (по ошибке) вы сбрасываете "посещенные" в пустой набор при входе в функцию, даже если вы передаете его в качестве аргумента из внутреннего вызова. Это, вероятно, приводит к проблеме максимальной глубины, потому что теперь он может «пинг-понг» между двумя соседями или следовать за циклами в вашем графике.
когда вы вызываете функцию извне, чтобы запустить ее, просто пропустите пустой набор:
shortest_path(source, target, set())
Вы делаете то же самое со списком путей. Вам нужно передать его в рекурсии, чтобы следующие шаги добавили в растущий список, а НЕ сбросили его в функции. Таким образом, вы, вероятно, получите новую сигнатуру функции, которая включает путь.
Вы можете немного очистить его с помощью значений по умолчанию, таких как:
def shortest_path(source, target, visited=set(), path=list() ):