【问题标题】:DFS for finding if route exists between two nodes用于查找两个节点之间是否存在路由的 DFS
【发布时间】:2017-05-23 08:33:41
【问题描述】:

我正在尝试实施 DFS,但在这方面遇到了一些麻烦。

首先,我设法得到一个简单的 DFS 示例,它只在访问节点时打印出节点。

def DFS_helper(self, node, visited):
    if node == None:
        return

    print(node.val)
    visited.append(node)

    for child in self.getChildren(node):
        if child not in visited:
            self.DFS_helper(child, visited)


def DFS(self, node):
    visited = []
    return self.DFS_helper(node, visited)

请注意,在上面的代码示例中,我使用 self.DFS_helper... 而不是 return 语句。为什么是这样?

现在,我正在尝试确定图中的两个节点是否可达。这是我的尝试。

def _isReachable(self, nodeA, nodeB, visited, stack):
    if len(stack) == 0:
        return False

    if nodeA == nodeB:
        return True

    front = stack.pop(0)
    visited.add(front) # mark the node as visited

    for neighbor in nodeA.neighbors:
        if neighbor not in visited: # if it's not already been visited
            stack.append(neighbor)
            return self._isReachable(neighbor, nodeB, visited, stack)

# given a directed graph, returns true if there is a route from nodeA to nodeB
# Returns false otherwise
# this method essentially runs a DFS from nodeA to nodeB
def isReachable(self, nodeA, nodeB):
    if nodeA == None or nodeB == None:
        return False
    if nodeA == nodeB:
        return True

    stack = [nodeA]
    visited = set()
    return self._isReachable(nodeA, nodeB, visited, stack)

它不仅不起作用,而且我不太确定我是否理解调用递归函数和返回它的结果之间的区别。我已经尝试了两种方法都没有成功。对我的代码和概念上的任何帮助将不胜感激!

【问题讨论】:

  • 我相信DFS_helper(self, node, visited), DFS(self, node), _isReachable(self, nodeA, nodeB, visited, stack), isReachable(self, nodeA, nodeB) 是类方法。如果不是,那么使用self.fun() 语法调用它们是没有意义的。 return self.DFS_helper(node, visited) 完全没问题。递归发生在DFS_HELPER
  • 你能给我们提供样本输出和输入吗?什么是节点A?一类?列表?列表的姐妹?字典中的元素?没有足够的信息。

标签: python algorithm graph depth-first-search


【解决方案1】:

问题出在您的退货声明中:

return self._isReachable(neighbor, nodeB, visited, stack)

在这里,您在找到第一个孩子的结果后中断,而不是汇总所有孩子的结果。

看这个例子:

source: a
target: d

      a
    /   \
  /       \
 b          c
            |
            |
            d

现在,如果您在(c,d) 之前通过(a,b) 遍历图形,则此返回语句将意味着您不会探索c,然后是d,您将回答d 未连接。

要解决,需要返回_isReachable(b,...) or _isReachable(c,...)

(当然,将其推广到每个节点超过两个子节点)

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多