BFS(广度优先搜索)
图的应用中,最重要的一部分就是图的搜索和遍历,图的搜索算法有很多,而BFS是其中一种比较简单的搜索算法。算法核心在于,从初始顶点开始,一层一层遍历搜索顶点,直到所有顶点搜索完毕,如下图所示:
实现这个算法,我们首先定义level字典,保存每个vertex的层级信息,frontier列表用来保存上一层级遍历过的vertex,parent字典用来保存每个vertex的上一个vertex。为此代码的思路如下:
初始化:level,frontier,parent 保存初始顶点
遍历frontier的所有顶点:
定义next列表,保存下一次需要遍历的顶点
遍历所有与frontier中顶点相连的其他顶点:
如果不在level中即没有遍历:
更新level,parent,next
frontier = next
层级加一
因此我们的代码如下
def bfs_1(graph, start):
"""
return: 被遍历的顶点次序和level字典
"""
level = {
start: 0}
parent = {
start: None}
i = 1
frontier = [start]
node_visited = [start]
while frontier:
next = []
for u in frontier:
for v in graph.get_connected_nodes(u):
if v not in level:
level[v] = i
parent[v] = u
next.append(v)
node_visited.append(v)
frontier = next
i