我正在尝试实施深度优先搜索,但在有向图中的循环方面我遇到了麻烦。
directed_graph = {
'a': ['b'],
'b': ['c', 'd', 'e'],
'c': ['d', 'e'],
'd': ['a', 'e'],
'e': ['f'],
'f': [],
'g': ['d']
}
忽略每条边的权重:
B -> C -> D -> A -> B
def dfs(graph, start, end, visited=[]):
if start == end:
return True
if start is None or end is None:
return False
queue = [start]
if start not in visited:
visited = visited + [start]
node = queue.pop(0)
for i in graph[node]:
if i == end:
return True
if i not in visited:
visited.append(i)
return dfs(graph, i, end, visited)
return False
当我使用start = 'b'
和end = 'f'
运行该功能时,如果False
True
答案 0 :(得分:1)
程序的问题在于,它仅考虑每个顶点的第一个未访问邻居。在for
循环中,对于每个未访问的邻居,递归调用dfs
。但是,然后将返回此调用的结果(意味着for
循环已中止)。因此,将不考虑其他未访问的邻居。
在示例图中,程序首先访问起始顶点a
。然后,它考虑第一个未访问的邻居,即b
。在b
,它到达第一个未访问的邻居,即d
。在d
,第一个未访问的邻居是a
。由于a
没有来访的邻居(唯一的邻居是b
,已经访问过),for
循环为a
和{{1} return False
的{{1}}呼叫已到达}。返回对dfs
的{{1}}调用,然后a
循环将被中止,以返回对dfs
的{{1}}调用给出的d
。这样,for
将在调用链中传播,从而导致您的初始查询返回最终的False
。
要解决此问题,请将递归调用更改为dfs
,以使a
循环仅在调用返回False
时中止:
False
使用此修复程序,您的程序将为dfs
和for
给出True
。