广度优先搜索遍历
(1)广度优先搜索遍历的定义
广度优先搜索遍历类似于树的按层遍历,其遍历过程如下:
1.访问初始点vi,并将其标记已访问过,访问vi的所有未被访问过的邻接点(次序可任意),假定依次为vi1、vi2、…、vit,并均标记已访问过。
2.然后按邻接点访问的先后次序,依次访问V11,V22,……Vit所有未被访问的邻接点,直至所有顶点访问完。
(2)广度优先搜索遍历的过程
下面结合图7-10所示的有向图G8分析从v0出发进行广度优先搜索遍历的过程。
1.访问初始点v0,并将其标记为已访问过;
2.访问v0的所有未被访问过的邻接点v1和v2,并将它们标记为已访问过;
3.访问顶点v1的所有未被访问过的邻接点v3、v4和v5,并将它们标记为已访问过;
4. 访问顶点v2的所有未被访问过的邻接点v6(它的两个邻接点中的一个顶点v5已被访问过),并将其标记为已访问过;
5.访问顶点v3的所有未被访问过的邻接点v7(只此一个邻接点且没有被访问过),并将其标记为已访问过;
6.访问顶点v4的所有未被访问过的邻接点,因v4的邻接点v7(只此一个)已被访问过,所以此步不访问任何顶点;
7.访问顶点v5的所有未被访问过的邻接点v8,并将其标记为已访问过;
8.访问顶点v6的所有未被访问过的邻接点,因v6的仅一个邻接点v8已被访问过,所以此步不访问任何顶点;
9. 依次访问v7和v8的所有未被访问的邻接点,因它们均没有邻接点(即出边邻接点),所以整个遍历过程到此结束。
从以上对有向图G8进行广度优先搜索遍历的过程分析可知,从初始点v0出发,得到的访问各顶点的次序为:v0,v1,v2,v3,v4,v5,v6,v7,v8。
(3)广度优先搜索遍历的算法描述
在广度优先搜索遍历中,先被访问的顶点,其邻接点亦先被访问,所以在算法的实现中需要使用一个队列,用来依次记住被访问过的顶点。算法开始时,将初始点vi访问后插入队列中,以后每从队列中删除一个元素,就依次访问它的每一个未被访问过的邻接点,并令其进队,这样,当队列为空时,表明所有与初始点有路径相通的顶点都已访问完毕,算法到此结束。
下面分别以邻接矩阵和邻接表作为图的存储结构给出相应的广度优先搜索遍历的算法,同样在算法中使用的标记数组visited[MaxVertexNum]为全程量。
邻接矩阵广度优先搜索遍历算法
void bfs1(adjmatrix GA, int i, int n) /*从初始点vi出发广度优先搜索由邻接矩阵GA表示的图*/{/*定义一个顺序队列Q,其元素类型应为整型,初始化队列为空*/ int Q[MS]; //MS是一个事先定义的符号常量 int front=0, rear=0;/*访问初始点vi,同时标记初始点vi已访问过*/ printf("%d