算法思想:
广度优先搜索(BFS,Breadth-First-Search)类似于二叉树的层序遍历算法。基本思想是:首先访问给出的顶点v(也就是初始顶点),接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,...wi,这里可以使用辅助队列,将由v出发访问到的各个顶点存储于辅助队列中,再不断地从队列中取得下一个出发点,并将当前出发点的所有未被访问过的邻接顶点加入到队列中,不断重复,直至队列为空,则搜索完毕。(若图中有多个连通分量则需要调用多次BFS函数)。
注:如果对过程不明确的可以先看一下二叉树的层序遍历算法
伪代码:
这是来自于王道书上的伪代码,其中可能存在的问题主要是在检测邻接点那一块可能有困难,这就和你使用的图的存储结构有关系了,若是邻接矩阵,根据出发点循环出发点那一行的n条边即可。若是邻接表,根据出发点挨个访问链表结点即可。
bool visited[MAX_VERTEX_NUM]; //访问标记数组
void BFSTraverse(Graph G){ //对图G进行广度优先遍历
for(i=0;i<G.vexnum;i++)
visited[i]=FALSE; //访问标记数组初始化
InitQueue(Q); //初始化辅助队列Q
for(i=0;i<G.vexnum;i++) //从0号顶点开始遍历
if(!visited[i]) //对每个连通分量调用一次BFS
BFS(G,i); //vi 为访问过,从vi开始BFS
}
void BFS(Graph G, int v){ //从顶点v出发,广度优先遍历图G
visit(V); //访问初始顶点v
visited[v]=TRUE; //对v做已访问标记
Enqueue(Q,V); //顶点v入队列Q
while(!isEmpty(Q)){
DeQueue(Q,V); //顶点v出队列
for(w=FirstNeighbor(G,V);w≥0;w=NextNeighbor(G,v,w)) //检测v所有邻接点
if(!visited[w]) { //w为v的尚未访问的邻接结点
visited(w); //访问顶点w
visited[w]=TRUE; //对w做已访问标记
EnQueue(Q,W); //顶点w入队列
}
}
}