图的广度优先搜索遍历类似(BFS)类似于树的层次遍历
基本思想:首先访问起始顶点 v ,然后选取与 v 邻接的全部顶点 w1 , … , wn 进行访问,再依次访问与 w1 , … , wn 邻接的全部顶点(已经访问过的除外),以此类推,直到所有顶点都被访问为止。
广度优先搜索遍历图的时候,需要用到一个队列(二叉树的层次遍历也要用到队列),算法的执行过程可以简单的概括如下:
1)选取任一顶点进行访问,并将这个顶点标记为已访问;
2)当队列不为空的时候循环执行:入队,依次检查出队顶点的全部邻接顶点,访问没有被访问过的邻接顶点并将其入队
3)当队列为空时跳出循环,广度优先搜索遍历完成
以邻接表为存储结构的广度优先搜索遍历算法如下:
void BFS(AGraph *G, int v, int visit[maxSize]){
ArcNode *p;
int que[maxSize], front=0, rear=0; //定义队列,简单写法
int j;
Visit(v); //访问顶点 v 的函数
visit[v] = 1; //标记已访问
rear = (rear+1)%maxSize; //当前顶点 v 入队
que[rear] = v;
while(front!=rear){
front = (front+1)%maxSize; //顶点出队
j=que[front];
p = G->adjlist[j].firstarc; //p指向出队顶点 j 的第一条边
while(p!=NULL){ //将 p 的所有未被访问的邻接顶点入队
if(visit[p->adjvex] == 0){ //当前顶点未被访问则入队
Vistit(p->adjvex)
vivit[p->adjvex] = 1;
rear = (rear+1)%maxSize;
que[rear] = p->adjvex;
}
p = p->nextarc; //p 指向 j 的下一条边
}
}
}
以上遍历算法是针对连通图。对于非连通图的遍历,只需要将上诉函数放在一个循环中,循环检测图中的每一个顶点,如果当前顶点没有被访问,则调用函数从这个顶点遍历,否则什么都不做
(1)深度搜索遍历
void dfs(AGraph *G){
int i;
for(int i=0;i<G->n;i++){
if(visit[i]==0){
DFS(G,i);
}
}
}
(2)广度搜索遍历
void bfs(AGraph *G){
int i;
for(int i=0;i<G->n;i++){
if(visit[i]==0){
BFS(G,i,visit);
}
}
}