簡體   English   中英

DFS查找兩個節點之間是否存在路由

[英]DFS for finding if route exists between two nodes

我正在嘗試實施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)

它不僅不起作用,而且我不確定我是否理解調用遞歸函數與返回結果之間的區別。 我嘗試了兩種方法都無濟於事。 對代碼的任何幫助,從概念上來說,對我來說,將不勝感激!

問題出在您的return語句中:

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

在這里,您在找到第一個孩子的結果之后開始休息,而不是匯總所有孩子的結果。

看這個例子:

source: a
target: d

      a
    /   \
  /       \
 b          c
            |
            |
            d

現在,如果您在(c,d) (a,b)之前通過(a,b)遍歷該圖,則該return語句將意味着您將不探索c然后是d ,並且您將回答d未連接。

要解決此問題,您需要返回_isReachable(b,...) or _isReachable(c,...)

(當然,將其推廣到每個節點兩個以上的子節點)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM