[英]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.