一、基础
广度优先搜索需要注意的几点:1)需要对已经入队过的节点予以标记,防止进入死循环。这相当于《算法导论》伪代码中对节点进行着色的操作。2)广度优先搜索一定可以找到每一点到原点的最短路径,这里的最短路径只得是边的条数,如果我们要找一条权重之和最短的路径,依然可以用广度优先搜索算法,只不过对于稠密图算法复杂度很高(这时需要遍历整个图,每次还需要更新当前节点的所有子节点的距离信息)。为了回溯信息,可以定义一个father数组,指向每个元素的父节点,当然也可以把这些信息保存在节点内部,需要根据具体应用场景来决定。
另外一点就是要区分图的搜索与遍历。下面给出的BFS是广度优先搜索,它不能保证遍历到所有的点,比如在有向图中,或者在森林中。如果想用BFS遍历图的所有节点,需要对每个节点调用BFS,这对有向图或无向图都是如此。
伪代码:
BFS(G,s)
for each vertex u in G.V-{s}
u.color = WHITE
u.d = inf
u.pi = NUL
s.color = GRAY
s.d = 0
s.pi = NIL
Q = Empty
ENQUEUE(Q,s)
while Q != Empty
u = DEQUEUE(Q)
for each v in G.adj[u]
if v.color == WHITE