Я следил за видео Тушара Роя об обнаружении циклов в ориентированных графах.Я понимаю использование белых, серых и черных наборов для обнаружения цикла, но главное, что я не понимаю, это то, как при проверке длины набора white
, next(iter(white))
будет знать, куда идти дальшетак как установленный размер изменился.В документации сказано, что iter
дает вам объект итератора, а next
извлекает следующий элемент.Является ли главное, что итератор оценивается каждый раз по-разному?
Вы можете найти код здесь или здесь .
def has_cycle(graph):
white = set()
gray = set()
black = set()
for vertex in graph.all_vertex.values():
white.add(vertex)
while len(white) > 0:
current = next(iter(white))
if dfs(current, white, gray, black) == True:
return True
return False
def dfs(current, white, gray, black):
move_vertex(current, white, gray)
for neighbor in current.adjacent_vertices:
if neighbor in black:
continue
if neighbor in gray:
return True
if dfs(neighbor, white, gray, black) == True:
return True
move_vertex(current, gray, black)
return False
def move_vertex(vertex, source_set, destination_set):
source_set.remove(vertex)
destination_set.add(vertex)