Форум сайта python.su
Есть алгоритм поиска в глубину на графах.
Код ниже.
#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))
['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'
print(topologicSortDFS2(Edges1))
Офлайн