//该算法比较重要,看文字的时候最好集中注意力,看不懂多敲几遍代码,对图不了解的可以先百度一下
图的广度优先遍历类似于树的层次遍历,采用的搜索方法的特点是尽可能先对横向结点进行搜索,故称其为广度优先搜索(Breadth-First-Search).
其基本思想是:
给定图 G= (V, E) 从图中某个源点v出发,在访问了顶点V之后接着就尽可能先在横向搜索V的所有邻接点。在依次访问V的各个未被访问的邻接点w1,w2,....,wk之后,分别从这些邻接点出发依次访问与w1,w2,...,wk邻接的所有未访问过的顶点。依次类推,直至图中所有和源点V有路径相通的顶点都已经访问过为止,此时从V开始的搜索过程结束。若G是连通图,则遍历完成;否则,在图G中另选一个尚未访问的顶点作为新源点继续上述的搜索过程,直至图G中所有顶点均已被访问为止。
采用广度优先搜索法遍历图的方法称为图的广度优先遍历。
对如图所示的无向图G11进行广度优先遍历的过程为:首先访问起始点,假设从C0出发,接着访问与C0邻接的顶点C1和C2,然后依次访问与C1邻接的未曾访问的顶点C3和C4,最后访问与C2;邻接的顶点C5。至此,这些顶点的邻接点均已被访问,并且图中的所有顶点都已被访问,图的遍历结束,得到该图的广度优先遍历(简称BSF序列)为:
C0->C1->C2->C3->C5
为确保先访问的顶点其邻接点亦先被访问,在搜索过程中可使用队列来保存已访问过的顶点。当访问V和u时,这两个顶点相继入队,此后,当V和u相继出队时,分别从V和u出发搜索其邻接点V1,V2,..,Vs和u1,u2,..ut,对其中未访者进行访问并将其入队。这种方法是将每个已访问的顶点入队,保证邻每个顶点至多只有一次入队
若图采用邻接表存储结构,则算法如上图的广度优先遍历算法可表示如下
//图的广度优先遍历算法 文件名bfs.c
#include "ljb.h"
int visited[M]; //全局标志向量
//函数功能:从顶点i出发广度优先变量图g的连通分量
//函数参数:图的邻接表g,遍历始点i
//函数返回值:无
void bfs(linkedGraph g,int i)
{
int j;
EdgeNode *p;
int queue[M],front,rear; //FTFO队列
front = rear = 0; //初始化空队列
printf("%c",g.adjlist[i].vertex); //访问源点
visited[i] = 1;
queue[rear++] = i; //被访问结点进队
while (rear > front) //当队列非空时,执行下列循环体
{
j = queue[front++]; //出队
p = g.adjlist[j].FirstEdg;
while (p)
{
if (visited[p -&g