私はDFSを実装する際に手をかけていますが、これにはいくつか問題があります。2つのノード間にルートが存在するかどうかを調べるための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
文ではないことに注意してください。どうしてこれなの?
今、グラフの2つのノードに到達可能かどうかを判断しようとしています。ここに私の試みです。
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)
これは機能しないだけでなく、再帰関数を呼び出してその結果を返すことの違いを理解しているとは思えません。私は無駄なく両方の方法を試しました。コードの助けを借りて、概念的に私にとっては大いに感謝します!
(そしてもちろん、ノードあたりつ以上の子供たちのためにそれを一般化) 、ノード)、_isReachable(self、nodeA、nodeB、visited、stack)、isReachable(self、nodeA、nodeB)はクラスメソッドです。そうでなければ、 'self.fun()'構文を使ってそれらを呼び出す必要はありません。 'return self.DFS_helper(node、visited)'は完全に正しいです。 'DFS_HELPER'の内部で再帰が起こっています – Pavan
サンプル出力と入力を取得できますか? nodeAとは何ですか?クラス?リスト?リストのsist?辞書の要素ですか?十分な情報がありません。 – Pavan