У меня есть (вероятно) простой вопрос обхода графа. Я новичок в графике, используя networkx в качестве структур данных графа. Мои графики всегда выглядят так:
0
1 8
2 3 9 10
4 5 6 7 11 12 13 14
Мне нужно вернуть путь от корневого узла к заданному узлу (например, path(0, 11)
должно вернуть [0, 8, 9, 11]
).
У меня есть решение, которое работает, передавая список, который растет и сжимается, чтобы отслеживать, как выглядит путь, когда вы проходите по дереву, и в конечном итоге возвращается, когда целевой узел найден:
def VisitNode(self, node, target, path):
path.append(node)
# Base case. If we found the target, then notify the stack that we're done.
if node == target:
return True
else:
# If we're at a leaf and it isn't the target, then pop the leaf off
# our path (backtrack) and notify the stack that we're still looking
if len(self.neighbors(node)) == 0:
path.pop()
return False
else:
# Sniff down the next available neighboring node
for i in self.neighbors_iter(node):
# If this next node is the target, then return the path
# we've constructed so far
if self.VisitNode(i, target, path):
return path
# If we've gotten this far without finding the target,
# then this whole branch is a dud. Backtrack
path.pop()
Я чувствую в своих костях, что нет необходимости передавать этот список "путей"... Я должен иметь возможность отслеживать эту информацию, используя стек вызовов, но я не могу понять, как... Может кто-нибудь просветить мне о том, как бы вы рекурсивно решили эту проблему, используя стек для отслеживания пути?
inspect
для такого простого алгоритма графа кажется мне не очень элегантным. - person Bas Swinckels   schedule 29.09.2013