(根据大神的学习方法,以后要养成写博客的习惯啦!!!啦啦啦!!!)
昨天重新温习了图的广度优先遍历,今天就小记一下吧!
好的,那我们现在就开始了呀:
广度优先搜索算法是最简单的图搜索算法之一,也是许多重要的图算法原型。Prim的最小生成树算法和Dijkstra的单源最短路径算法都是用了累死广度优先搜索的思想。
广度优先搜索之所以如此得名是因为该算法始终是将已经发现的节点和没有发现的节点之间的边界,沿着其广度方向向外扩展。算法需要在发现所有距离源节点s为k的所有节点之后,才会发现距离源节点s为k+1的其他节点。
为了跟踪算法的进展,广度优先搜索在概念上将每个结点涂成白色、灰色或者黑色。所有的结点在开始的时候都涂成白色,在这些结点可能会变成白色或者黑色。在搜索过程中,第一次发现就会吧结点涂成或灰色。凡是灰色或者黑色的结点都是已经发现的结点,但是黑的与灰色的区别是黑色是已经遍历完的结点。
BFS(G,s)
1 for each vertex u属于G.V – {s}
2 u.color =WHITE
3 u.d = 无穷
4 u.p =NIL
5 s.color=GRAY
6 s.d=0
7 s.p=NIL
8 Q=空
9 ENQUEUE(Q,s)
10 while Q != NIL
11 u=DEQUEUE(Q)
12 for each v属于Adj[u] 意思是遍历与u邻接的买个点。
13 if v.color == WHITE
14 v.color=GRAY
15 v.d=u.d+1
16 v.p=u
17 ENQUEUE(Q,V)
18 u.color=BLACK
再就是分析一下它的时间复杂度吧:
在前7行中,每一个点都会做3次初始化赋值操作,所以是3|V|,8,9行声明队列和源节点进入队列是2,除了源节点,所有的点都要进行一次进队列和出队列的操作,源节点再次要进行一次出队列的操作,所以是2(|V|-1)-1,在后面的12至18行中,每个点都要进行4次赋值,所以又有4|V|,遍历所有的邻接链表是2|E|。所以总得来说就是7|V|+2|E|.
广度优先算法计算出来的是最短路径。这里给出的是伪码,具体的源码下篇文章给出来。