Python DFS和BFS

Python DFS和BFS,python,graph,breadth-first-search,Python,Graph,Breadth First Search,这里是DFS,对吗 我试着和“兄弟姐妹”一起做点什么,但没用。 任何人都可以编写类似于此站点代码的BFS。是的,它是DFS 要编写BFS,您只需要保留一个“待办事项”队列。您可能还希望将函数转换为生成器,因为BFS通常会在生成所有可能路径之前故意终止。因此,此函数可用于查找路径或查找所有路径 def paths(graph, start, end): todo = [[start, [start]]] while 0 < len(todo): (node,

这里是DFS,对吗

我试着和“兄弟姐妹”一起做点什么,但没用。 任何人都可以编写类似于此站点代码的BFS。

是的,它是DFS

要编写BFS,您只需要保留一个“待办事项”队列。您可能还希望将函数转换为生成器,因为BFS通常会在生成所有可能路径之前故意终止。因此,此函数可用于查找路径或查找所有路径

def paths(graph, start, end):
    todo = [[start, [start]]]
    while 0 < len(todo):
        (node, path) = todo.pop(0)
        for next_node in graph[node]:
            if next_node in path:
                continue
            elif next_node == end:
                yield path + [next_node]
            else:
                todo.append([next_node, path + [next_node]])
这里是一个O(N*max(顶点度))广度优先搜索实现。bfs函数按广度优先顺序生成节点,并为每个节点生成一个生成器,该生成器可用于追踪最短路径到起点。路径的惰性意味着您可以迭代生成的节点以找到感兴趣的点,而无需支付构建所有中间路径的成本

import collections

GRAPH = {'A': ['B', 'C'],
         'B': ['C', 'D'],
         'C': ['D'],
         'D': ['C'],
         'E': ['F'],
         'F': ['C']}

def build_path(node, previous_map):
    while node:
        yield node
        node = previous_map.get(node)

def bfs(start, graph):
    previous_map = {}
    todo = collections.deque()
    todo.append(start)
    while todo:
        node = todo.popleft()
        yield node, build_path(node, previous)
        for next_node in graph.get(node, []):
            if next_node not in previous_map:
                previous_map[next_node] = node
                todo.append(next_node)

for node, path in bfs('A', GRAPH):
    print node, list(path)

为什么不检查一个像样的图形实现,比如python graph?深度优先搜索
import collections

GRAPH = {'A': ['B', 'C'],
         'B': ['C', 'D'],
         'C': ['D'],
         'D': ['C'],
         'E': ['F'],
         'F': ['C']}

def build_path(node, previous_map):
    while node:
        yield node
        node = previous_map.get(node)

def bfs(start, graph):
    previous_map = {}
    todo = collections.deque()
    todo.append(start)
    while todo:
        node = todo.popleft()
        yield node, build_path(node, previous)
        for next_node in graph.get(node, []):
            if next_node not in previous_map:
                previous_map[next_node] = node
                todo.append(next_node)

for node, path in bfs('A', GRAPH):
    print node, list(path)
def recursive_dfs(graph, start, path=[]):
  '''recursive depth first search from start'''
  path=path+[start]
  for node in graph[start]:
    if not node in path:
      path=recursive_dfs(graph, node, path)
  return path

def iterative_dfs(graph, start, path=[]):
  '''iterative depth first search from start'''
  q=[start]
  while q:
    v=q.pop(0)
    if v not in path:
      path=path+[v]
      q=graph[v]+q
  return path

def iterative_bfs(graph, start, path=[]):
  '''iterative breadth first search from start'''
  q=[start]
  while q:
    v=q.pop(0)
    if not v in path:
      path=path+[v]
      q=q+graph[v]
  return path

'''
   +---- A
   |   /   \
   |  B--D--C
   |   \ | /
   +---- E
'''
graph = {'A':['B','C'],'B':['D','E'],'C':['D','E'],'D':['E'],'E':['A']}
print 'recursive dfs ', recursive_dfs(graph, 'A')
print 'iterative dfs ', iterative_dfs(graph, 'A')
print 'iterative bfs ', iterative_bfs(graph, 'A')