我从这里找到了bfs_visited的实现(返回广度优先搜索算法已达到的所有节点): http://eddmann.com/posts/depth-first-search-and-breadth-first-search-in-python/
def bfs(graph, start):
visited, queue = set(), [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
queue.extend(graph[vertex] - visited)
return visited
bfs(graph, 'A') # {'B', 'C', 'A', 'F', 'D', 'E'}
对于图表的表示,它可以正常工作:
graph1 = {'A': set(['B', 'C']),
'B': set(['A', 'D', 'E']),
'C': set(['A', 'F']),
'D': set(['B']),
'E': set(['B', 'F']),
'F': set(['C', 'E'])}
但我想改用这个实现:
graph2 = { 1: set([2]), # changed
2: set([1, 3, 4]),
3: set([2, 4]),
4: set([2, 3]),
5: set([]),
6: set([5])}
这个工作几乎没问题:
>>> bfs_visited(graph2, graph2[1])
set([1, 2, 3, 4])
除了在孤立顶点的情况下,它返回一个空集,而不是 具有单个元素的集合:
>>> bfs_visited(graph2, graph2[5])
set([])
有没有办法在第二种表示的情况下将set([5])作为输出?
答案 0 :(得分:1)
首先,你是不一致的,要么在两个键和值或整数中使用字符串,不要混用它们
graph2 = { '1': set(['2']), '2': set(['1', '3', '4']), '3': set(['2', '4']), '4': set(['2', '3', '6']), '5': set([]), '6': set(['4'])}
第二,你的bfs接受顶点名称,而不是他们的邻居,所以你应该调用
bfs(graph2,' 5')#correct
不
bfs(graph2,graph2 [' 5'])#incorrect
它就像一个魅力
>>> bfs(graph2, '2') set(['1', '3', '2', '4', '6']) >>> bfs(graph2, '5') set(['5'])