实现具有最大深度的BFS算法并打印所有最短路径

时间:2016-10-01 06:31:27

标签: python algorithm shortest-path breadth-first-search

这是我想出的BFS算法,用于打印从根节点到图中任何其他节点的所有最短路径:

d = deque()
d.append(root)
level = 0
while len(d) >= 0 and level <= max_depth:
    u = d.popleft()
    print(adjacency_list[u])
    for v in adjacency_list[u]:
        if visited[v] == 'N':
            if nodes2distances[u] + 1 <= nodes2distances[v]:
                nodes2distances[v] = nodes2distances[u] + 1
                node2parents[v].append(u)
                d.extend(v)
    level += 1
    visited[u] = 'Y'

当我没有指定最大级别条件时,上面的代码工作正常,但是,每次运行此算法时,输出都会因级别限制而变化。

1)你能解释一下如何用水平限制来实现这个算法(即指定最大水平)?

2)另外,如果我采取的解决问题的方法可以更好,请你告诉我吗?

编辑: 好的!!对不起,我之前没做过!! 假设我在未加权的图表中有以下边缘:

(&#39; A&#39;,&#39; B&#39;),(&#39; A&#39;,&#39; C&#39;),(&#39; ; B&#39;,&#39; C&#39;),(&#39; B&#39;,&#39; D&#39;),(&#39; D&#39;,&#39; E&#39;),(&#39; D&#39;,&#39; F&#39;),(&#39; D&#39;,&#39; G&#39;),(&#39; ; E&#39;,&#39; F&#39;),(&#39; G&#39;,&#39; F&#39;)

在没有深度限制的情况下实现我的代码后,当我为节点&#39; B&#39;

调用算法时,我得到以下输出
[('A', ['B']), ('C', ['B']), ('D', ['B']), ('E', ['D']), ('F', ['D']), ('G', ['D'])]

但是,当我调用级别限制为2的相同函数,即myFunction(graph,'E',2)时,我得到以下输出:

[('A', ['B']), ('C', ['B']), ('D', ['B'])]

然而,预期的输出是

[('A', ['B']), ('C', ['B']), ('D', ['B']),('E',['D']),('F', ['D']),('G',['D'])]

1 个答案:

答案 0 :(得分:1)

您正在错误的地方递增等级。每个节点的级别等于其父级别加1.您不应在while循环中全局增加级别。相反,您应该存储放入队列的每个节点的级别。像这样:

d = deque()
          #node,level
d.append( (root,0   ) )
while len(d) >= 0:
    front = d.popleft()
    u = front[0]
    level = front[1]
    if level >= max_depth:
        break
    print(adjacency_list[u])
    for v in adjacency_list[u]:
        if visited[v] == 'N':
            if nodes2distances[u] + 1 <= nodes2distances[v]:
                nodes2distances[v] = nodes2distances[u] + 1
                node2parents[v].append(u)
                d.append( (v,level+1) )
    visited[u] = 'Y'