Цикл обнаружения программы DFS завершается с ошибкой ключа

Я пытаюсь реализовать обнаружение цикла в группе обеспечения доступности баз данных, и я использую словарь для отслеживания вершин, которые находятся в стеке рекурсии, устанавливая для их значений значение True в словаре. Как только они выходят, я устанавливаю их значение на единицу. Если я сталкиваюсь с одним и тем же узлом, пока он находится в стеке рекурсии, это цикл. Часть кода, которую я сравниваю со словарем стека рекурсии, пропускается. Я попытался отладить код, но я не понимаю, почему он не входит в часть сравнения в рекурсивной функции.

PS: Ребята, это не задание. Я просто тренируюсь.

График:

directed_cyclic_graph = {
'g': ['h'],
'a': ['h', 'b'],
'b': ['c'],
'd': ['b', 'e'],
'c': ['f'],
'e': ['f'],
'i': ['i'],
'f': ['d'],
'h': [None]
}

Код:

def cycle_detection_recursive(adjList, vertex, parent, recursion_stack):
for nv in adjList[vertex]:
    # In the case there is a cycle to itself
    if recursion_stack[nv] and nv is not None:
        print("Loop detected", nv, "-->", nv)
    if nv not in parent:
        if nv is not None:
            parent[nv] = vertex
            if not recursion_stack[nv]:

                print(nv, "enters recursion stack")
                recursion_stack[nv] = True
            else:
                print("Cycle detected:", "back edge", nv, "-->", vertex)
            cycle_detection_recursive(adjList, nv, parent, recursion_stack)
            recursion_stack[nv] = False
            print(nv, "exits recursion stack")

def cycle_detection(DAG):
recursion_stack = {}
parent = {}
adjList = DAG

for vertex in adjList:
    if vertex not in parent:

        print(vertex, "enters recursion stack")
        recursion_stack[vertex] = True
        parent[vertex] = None
        cycle_detection_recursive(adjList, vertex, parent, recursion_stack)
        recursion_stack[vertex] = False
        print(vertex, "exits recursion stack")

def main():

    print("Breakpoint")
    cycle_detection(directed_cyclic_graph)

Наконец, ошибка:

Traceback (most recent call last):
File "D:/Coding_Practice/Dynamic_Programming/graph_traversal.py", line 194, in <module>
b enters recursion stack
main()
File "D:/Coding_Practice/Dynamic_Programming/graph_traversal.py", line 190, in main
cycle_detection(directed_cyclic_graph)
File "D:/Coding_Practice/Dynamic_Programming/graph_traversal.py", line 177, in cycle_detection
cycle_detection_recursive(adjList, vertex, parent, recursion_stack)
File "D:/Coding_Practice/Dynamic_Programming/graph_traversal.py", line 146, in cycle_detection_recursive
if recursion_stack[nv] and nv is not None:
KeyError: 'c'

0 ответов

Другие вопросы по тегам