Я думаю, вы не хотите менять tos
в цикле for.В DFS вы помещаете все соседние узлы в произвольном порядке в стек, а когда завершение выполняется, вы берете самый последний, то есть вершину стека, и продолжаете это делать.
Так что вам это не нужнолиния tos = stack[-1]
внутри вашего цикла for вообще!Кроме того, вы добавляете узел недавно добавленный после того, как он был добавлен в ваш цикл for, а это не то, что вам нужно.Так что вам нужно переместить stack.pop()
строку перед циклом for.Это также имеет смысл, поскольку в DFS вы извлекаете (удаляете) один из стека, помещаете в него соседние и повторяете.Итак, вы делаете это:
while stack:
tos = stack[-1]
stack.pop()
for nextVertex in tos.getConnections():
if nextVertex.getColor() == 'white':
nextVertex.setColor('gray')
nextVertex.setPred(tos)
self.time += 1
nextVertex.setDiscovery(self.time)
stack.append(nextVertex)
tos.setColor('black')
self.time += 1
tos.setFinish(self.time)
То, что вы вместо этого хотели в своем вопросе:
Если по какой-либо причине (возможно, экспериментируя?) Вам нужно сделать что-то, что вы описали вваш вопрос, вы можете попробовать использовать временные tos для итерации.Например:
while stack:
tos = stack[-1]
temp_tos = tos
for nextVertex in temp_tos.getConnections():
if nextVertex.getColor() == 'white':
nextVertex.setColor('gray')
nextVertex.setPred(tos)
self.time += 1
nextVertex.setDiscovery(self.time)
stack.append(nextVertex)
tos = stack[-1]
Обратите внимание, что я добавил только одну строку перед циклом for и немного изменил заголовок цикла for.А остальное зависит от вас.