图的广度优先遍历算法类似与树的层序遍历,都需要借助队列来完成,但不同的是因为图中的数据元素之间的关系是多对多的,所以需要设置访问数组来表示每个数据元素是否被访问过,防止二次访问。即不断遍历访问当前节点及其所有未被访问的邻接点,直至无未被访问结点,再从这些邻接点开始出发遍历。
void BFSTraverse(Graph g){//广度优先遍历图g
int visited[MAX_VERTEX_NUM];//每个顶点的访问数组
for(int i=0;i<g.vexnum;i++){
visited[i]=0;//初始化访问数组,0代表未被访问
}
for(int i=0;i<g.vexnum;i++){//遍历一遍防止有遗漏结点
if(visited[i]==0){
BFS(g,i);
}
}
}
void BFS(Graph g,int v0){//从当前结点v0开始深度优先遍历
visit(v0);//访问该节点并更新访问标志
visited[v0]=1;
InitQueue(&Q);//初始化队列
EnterQueue(&Q,v0);
while(!IsEmpty(Q))){//队列非空则队头元素出队,对其未被访问邻结点操作
DeleteQueue(&Q,&v);
int w=FirstAdjVertex(g,v);//找队头元素头首个邻结点
while(w!=-1){//找到后,对其所有未被访问邻结点访问后入队
if(!visited[w]){
visit(w);
visited[w]=1;
EnterQueue(&Q,w);
}
w=NextAdjVertex(g,v,w);//更新w为下一个邻结点
}
}
}