广度优先搜索中的孤立顶点错误

时间:2014-09-18 19:35:27

标签: python breadth-first-search

我从这里找到了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])作为输出?

1 个答案:

答案 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'])