Оптимизация кода BFS (обхода в ширину)
Есть задача
Задача C. Варианты сообщения
Имя входного файла: стандартный ввод
Имя выходного файла: стандартный вывод
Ограничение по времени: 1 секунда
Ограничение по памяти: 256 мегабайт
После чемпионата мира по одной очень известной компьютерной игре настало время решаффлов — изменений составов команд. Менеджер команды «GetDoom?» написал на своей странице
ВКонтакте подзамочное сообщение (которое могут видеть только его друзья).
Все друзья менеджера прочитали это сообщение и тут же перепечатали его у себя, также в виде
подзамочного сообщения. Но каждый перепечатывавший сделал в тексте ровно одну опечатку —
либо вставил, либо удалил ровно одну букву.
Друзья тех, кто перепечатал это сообщение в первый раз (и которые ещё не видели этого сообщения), также прочитали и перепечатали у себя. И также сделали в тексте по сравнению с тем,
который перепечатывали, ровно одну опечатку — либо вставили, либо удалили ровно одну букву...
И так далее, до тех пор, пока на каком-то шаге не оказалось, что все пользователи либо читали (и
перепечатывали у себя) это сообщение, либо вообще не имеют возможности его прочитать.
Требуется определить, какое наибольшее количество пользователей, включая автора исходного
сообщения, может иметь у себя на странице точную копию исходного сообщения.
Формат входных данных
Первая строка входных данных содержит два целых числа N и M (2 <= N ,= 10^5, 1 <= M <= 2 · 10^5,
M <= N(N − 1)/2) — количество пользователей, интересующихся очень известной компьютерной
игрой, и количество пар друзей. Каждая из последующих M строк содержит по два целых числа
ai и bi (1 <= ai, bi <= N, ai != bi) — номера очередной пары пользователей, являющихся друзьями.
Считается, что в этой социальной сети отношение «быть друзьями» симметрично, то есть если a
друг b, то и b — друг a. Гарантируется, что ни одна пара пользователей не встречается в этом списке
дважды. Последняя строка содержит одно целое число s (1 <= s <= N) — номер менеджера команды
«GetDoom?».
Формат выходных данных
Выведите одно целое число — максимальное количество пользователей, у которых «под замком»
может оказаться исходный вариант сообщения.
Система оценки
Задача состоит из четырёх подзадач.
• В первой подзадаче N <= 500, M = N(N − 1)/2. Эта подзадача оценивается в 5 баллов.
• Во второй подзадаче у двух пользователей (включая s, менеджера команды) ровно один друг,
у каждого из других пользователей ровно два друга, а также гарантируется, что все пользователи в итоге увидят сообщение. Эта подзадача оценивается в 12 баллов.
• В третьей подзадаче N <= 500, M <= 1000. Эта подзадача оценивается в 18 баллов.
• В четвёртой подзадаче дополнительных ограничений нет. Эта подзадача оценивается в 65 баллов.
Пример
стандартный ввод стандартный вывод
7 5 2
3 2
3 4
1 3
1 2
6 5
1
И моя реализация
def bfs(graph, start):
distances = {user: float('inf') for user in graph}
distances[start] = 0
visited = set()
queue = [start]
while queue:
current_user = queue.pop(0)
visited.add(current_user)
for friend in graph[current_user]:
if friend not in visited:
queue.append(friend)
if distances[friend] == float('inf'):
distances[friend] = distances[current_user] + 1
return distances
n, m = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(m)]
s = int(input())
graph = {i: [] for i in range(1, n+1)}
# Строим граф по списку друзей
for edge in edges:
graph[edge[0]].append(edge[1])
graph[edge[1]].append(edge[0])
dist = bfs(graph,s)
count_even = sum(1 for user, distance in dist.items() if distance % 2 == 0)
print(count_even)
Но данный код слишком долго выполняет поставленную задачу, хоть и делает это правильно. Хотел бы узнать как можно решить данную задачу за меньшее кол-во времени и БЕЗ ИМПОРТА БИБЛИОТЕК