Python 返回图中所有可能路径的方法 class (DAG)

Python method for returning all possible paths in a graph class (DAG)

我有一个关于在有向无环图中从源到目的地查找所有路径的问题。为此,我制作了两个自定义的 classes 作为 Node 和 Graph。 Graph class 读取邻近矩阵以创建节点并在字典中添加连接。
在此之后,我希望能够使用递归找到从源到目的地的所有可能路径,并使用生成器返回它们,但我在递归调用时遇到问题,因为它没有正确导航路径。
AllPathUtils 方法没有移动到第一个方法调用之后。这几乎是我的代码,如果你们中的任何一个能指出我遗漏的愚蠢错误,我将不胜感激。 在底部,我将留下一些示例输入,因此您可以检查确切的行为。非常感谢。

class Node:
    def __init__(self, identity):
       self.name = identity

    def get_name(self):
        return self.name

    def __hash__(self):
        return hash(self.get_name())

    def __eq__(self, other):
       return self.get_name() == other.get_name()

    def __ne__(self, other):
        return not self == other

    def __str__(self):
        return f"Node -> {self.get_name()}"

    def __repr__(self):
        return f"Node -> {self.get_name()}"


class Graph:
    def __init__(self, matrix_graph):
        self.graph = {}
        self.V = len(matrix_graph)
        i = 0
        for node in matrix_graph:
            x = Node(i)
            self.graph[x] = []
            j = 0
            for adj in node:
                if matrix_graph[i][j] != 0:
                    self.graph[x].append(Node(j))
                j += 1
            i += 1

    def AllPathsUtil(self, u, d, visited, path):
        visited[u.get_name()] = True
        path.append(u)
        if u == d:
            yield path
        else:
            for i in self.graph[u]:
                if visited[i.get_name()] is False:
                    self.AllPathsUtil(i, d, visited, path)
        path.pop()
        visited[u.get_name()] = False

    def printAllPaths(self, s, d):
        visited = [False] * (self.V)
        path = []
        for el in self.AllPathsUtil(s, d, visited, path):
            print(el)



matrix2 = [[0, 1, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0]]

z = Graph(matrix2)
z.printAllPaths(Node(0), Node(4))

对于和我有同样问题的人,错误是我需要从递归调用中退出,否则它不会工作。 这是有问题的行:

self.AllPathsUtil(i, d, visited, path)

虽然这是正确的:

yield from self.AllPathsUtil(i, d, visited, path)