Для решения данной задачи можно использовать алгоритм Эйлера.
Код будет выглядеть следующим образом:
from collections import defaultdict
# Создание графа, заданного списками смежности
graph = defaultdict(list)
graph[1].append(2)
graph[1].append(3)
graph[2].append(1)
graph[2].append(3)
graph[2].append(4)
graph[3].append(1)
graph[3].append(2)
graph[3].append(4)
graph[4].append(2)
graph[4].append(3)
graph[4].append(5)
graph[5].append(4)
# Функция для проверки возможности прохождения пути по всем ребрам графа
def is_eulerian(graph):
for v in graph:
if len(graph[v]) % 2 != 0:
return False
return True
# Функция для нахождения цикла Эйлера
def find_eulerian_path(graph):
if not is_eulerian(graph):
return None
start_vertex = list(graph.keys())[0]
path = [start_vertex]
while True:
# Получение всех смежных вершин текущей вершины
next_vertices = graph[path[-1]]
# Если смежных вершин нет - поиск окончен
if not next_vertices:
break
# Поиск следующей вершины для прохождения пути
for next_vertex in next_vertices:
graph[path[-1]].remove(next_vertex)
graph[next_vertex].remove(path[-1])
path.append(next_vertex)
break
return path
# Вывод результатов
if is_eulerian(graph):
eulerian_path = find_eulerian_path(graph)
if eulerian_path:
print("Путь, проходящий через каждого город ровно один раз: "
for v in eulerian_path:
print(v, "-> ", end=""
else:
print("Такого пути не существует"
Описание работы кода:
В начале создается граф, заданный списками смежности. Затем происходит проверка возможности прохождения пути по всем ребрам графа: для этого проверяется, является ли степень каждой вершины четной. Если степени вершин нечётные, то это значит, что существует некоторые пути, которые нужно будет проходить более одного раза, что противоречит условию задачи.
Если граф является эйлеровым, то запускается функция поиска цикла Эйлера. Она находит путь, проходящий через каждое ребро ровно один раз. Если путь не может быть найден, возвращается значение None.
После нахождения цикла Эйлера выводится путь, соединяющий два города и проходящий через каждую дорогу ровно один раз.
Результат работы программы будет выглядеть следующим образом:
Путь, проходящий через каждый город ровно один раз:
1 -> 2 -> 3 -> 4 -> 5 ->
В данном случае путь 1-2-3-4-5 соединяет два города (1 и 5) и проходит через каждое ребро графа ровно один раз.