Неправильно написан алгоритм BFS

Дана следующая задача:

Алхимики средневековья владели знаниями о превращении различных химических веществ друг в друга. Это подтверждают и недавние исследования археологов.

В ходе археологических раскопок было обнаружено m глиняных табличек, каждая из которых была покрыта непонятными на первый взгляд символами. В результате расшифровки выяснилось, что каждая из табличек описывает одну алхимическую реакцию, которую умели проводить алхимики.

Результатом алхимической реакции является превращение одного вещества в другое. Задан набор алхимических реакций, описанных на найденных глиняных табличках, исходное вещество и требуемое вещество. Необходимо выяснить: возможно ли преобразовать исходное вещество в требуемое с помощью этого набора реакций, а в случае положительного ответа на этот вопрос — найти минимальное количество реакций, необходимое для осуществления такого преобразования. Входные данные

Первая строка входного файла INPUT.TXT содержит целое число m (0 ≤ m ≤ 1000) – количество записей в книге. Каждая из последующих m строк описывает одну алхимическую реакцию и имеет формат вещество1 -> вещество2, где вещество1 – название исходного вещества, вещество2 – название продукта алхимической реакции. m+2-ая строка входного файла содержит название вещества, которое имеется исходно, m+3-ая – название вещества, которое требуется получить.

Во входном файле упоминается не более 100 различных веществ. Название каждого из веществ состоит из строчных и заглавных английских букв и имеет длину не более 20 символов. Строчные и заглавные буквы различаются. Выходные данные

В выходной файл OUTPUT.TXT выведите минимальное количество алхимических реакций, которое требуется для получения требуемого вещества из исходного, или -1, если требуемое вещество невозможно получить.

Ссылка на задачу и примеры входных и выходных данных здесь

Я пишу следующий код:

from collections import defaultdict


class Graph:
    def __init__(self):
        self.graph = defaultdict(list)

    def addEdge(self, u, v):
        self.graph[u].append(v)

    def bfs(self, s, f, n):
        level = [-1] * n
        queue = [s]
        level[s] = 0
        while queue:
            node = queue.pop(0)
            try:
                l = list(self.graph[node])
                for child in l:
                    if level[child] == -1:
                        queue.append(child)
                        level[child] = level[node] + 1
            except KeyError:
                continue
        return level[f]


data = open('input.txt', 'r')
file = open('output.txt', 'w')

n = int(data.readline())
g = Graph()
names = []

for i in range(n):
    line = data.readline().split()
    a, _, b = map(str, line)
    if a in names:
        a = names.index(a)
    else:
        names.append(a)
        a = len(names) - 1
    if b in names:
        b = names.index(b)
    else:
        names.append(b)
        b = len(names) - 1
    g.addEdge(a, b)

s = data.readline().split()[0]
if s in names:
    s = names.index(s)
else:
    file.write('0')
    file.close()
    exit()
f = data.readline().split()[0]
if f in names:
    f = names.index(f)
else:
    file.write('-1')
    file.close()
    exit()
file.write(str(g.bfs(s, f, n)))
file.close()

Граф создаётся как словарь в виде списка смежности, а сама задача решается с помощью обхода в глубину. Но она валится на 7м тесте. :( Что в коде неправильно написано?


Ответы (0 шт):