这是《python算法教程》的第6篇读书笔记。笔记的主要内容为BFS(广度优先搜索,breath-first search)。
BFS会对图逐层访问记先访问某个节点的所有临接节点,之后再访问这个节点的其中一个临接节点的所有临接节点。以下图为例,BFS先访问a节点的邻接节点b、f;再访问b的邻接节点c、d、f;接下来访问a的另一个邻接节点 f 的邻接节点……
BFS将遍历下图。
DAG.JPG
#迭代版bfs
import collections
def bfs(G,s):
#P为记录每一个节点的父节点的字典
P={s:None}
Q=collections.deque()
Q.append(s)
while Q:
u=Q.popleft()
for v in G[u]:
if v in P.keys():
continue
P[v]=P.get(v,u)
Q.append(v)
return P
#图的邻接字典
G={
'a':{'b','f'},
'b':{'c','d','f'},
'c':{'d'},
'd':{'e','f'},
'e':{'f'},
'f':{}
}
P=bfs(G,'a')
print(P)
#获取a至e的路径
u='e'
path=[u]
while P[u] is not None:
path.append(P[u])
u=P[u]
path.reverse()
print(path)