遇到循环时,深度优先搜索输出错误

时间:2015-12-01 11:43:59

标签: python graph depth-first-search

我正在尝试实施深度优先搜索,但在有向图中的循环方面我遇到了麻烦。

directed_graph = {
    'a': ['b'],
    'b': ['c', 'd', 'e'],
    'c': ['d', 'e'],
    'd': ['a', 'e'],
    'e': ['f'],
    'f': [],
    'g': ['d']
}

忽略每条边的权重:

enter image description here

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

1 个答案:

答案 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

使用此修复程序,您的程序将为dfsfor给出True

相关问题