Есть алгоритм поиска в глубину на графах.
Код ниже.
#Color — массив, в котором хранятся цвета вершин (0 — белый, 1 — серый, 2 — черный).
#Edges — массив списков смежных вершин.
#Numbers — массив, в котором сохраняются новые номера вершин.
#Stack — стек, в котором складываются вершины после их обработки.
#Cycle — принимает значение true, если в графе найден цикл.
Edges = {'a':['c'], 'c':['b'], 'd':['c', 'b', 't'], 'b':[], 't':[]}
p = {'a':['b'],
     'b':['c','d','f'],
     'd':['dd','dd1']}
Edges1 = {'killerapp':['libzigzag.a'],
          'libzigzag.a':['zag.o', 'zig.o', 'libfoobar.a'],
          'zig.o':['zig.cpp','boz.h'],
          'zag.o':['boz.h','zag.cpp','yow.h','dax.h'],
          'libfoobar.a':['bar.o','foo.o'],
          'bar.o':['boz.h','yow.h','dax.h','bar.cpp'],
          'foo.o':['dax','zow.h','foo.cpp'],
          'zig.cpp':[],
          'boz.h':[],
          'zag.cpp':[],
          'yow.h':[],
          'dax.h':[],
          'bar':[],
          'zow.h':[],
          'foo.cpp':[]
        }
Edges2 = {'killerapp':['d'],
          'd':['zag.o', 'zig.o']
         }
arr1 = {'test.cpp':['testh','t'],
        'test.h':['de','tet.hhh']}
arr = {'test':['test1.s'],'test1.s':['dest','dest2'],'dest':[]}
def topologicSortDFS2(Edges):
    Stack=[]
    Color=dict()
    for i in Edges.keys():
        Color[i]=0
    def topological_sort():
        def dfs(v):
#Если вершина серая, то мы обнаружили цикл. 
#Заканчиваем поиск в глубину.
            if Color[v] == 1: return True
            if Color[v] == 2: return False#Если вершина черная, то заканчиваем ее обработку.
            Color[v] = 1#Красим вершину в серый цвет.
#Обрабатываем список смежных с ней вершин.
            for i in range(len(Edges[v])-1):
                if dfs(Edges[v][i]): return True
            Stack.append(v)#Кладем вершину в стек.
            Color[v] = 2#Красим вершину в черный цвет.
            return False;
         
#Вызывается обход в глубину от всех вершин. 
#Заканчиваем работу алгоритма, если обнаружен цикл.
        for i in Edges.keys():
            Cycle = dfs(i)
            if Cycle: 
                print("!!!имеется цикл!!!")
                exit()
                 
#Заносим в массив новые номера вершин.    
        Stack.reverse()
        return Stack
    return topological_sort()
print(topologicSortDFS2(Edges))
print(topologicSortDFS2(arr))
С простыми примера работает. Например переменная с словарем Edges и arr работает. Но когда я добавляю к второй вершине - третью смежную вершину - сразу вылазит ошибка.
['a', 't', 'd', 'b', 'c']
Traceback (most recent call last):
['test', 'test1.s', 'dest']
File "/home/zubr/PycharmProjects/Learning/lab4_1.py", line 65, in <module>
print(topologicSortDFS2(Edges1))
File "/home/zubr/PycharmProjects/Learning/lab4_1.py", line 62, in topologicSortDFS2
return topological_sort()
File "/home/zubr/PycharmProjects/Learning/lab4_1.py", line 54, in topological_sort
Cycle = dfs(i)
File "/home/zubr/PycharmProjects/Learning/lab4_1.py", line 46, in dfs
if dfs(Edges[v][i]): return True
File "/home/zubr/PycharmProjects/Learning/lab4_1.py", line 41, in dfs
if Color[v] == 1: return True
KeyError: 'dax'
Данная ошибка вылазит, когда я пытаюсь сделать поиск с графом Edges1.
print(topologicSortDFS2(Edges1))
Помогите разобраться.