图的遍历BFS

时间:2020-06-30
本文章向大家介绍 图的遍历BFS ,主要包括 图的遍历BFS 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

图的遍历BFS

  1. 广度优先遍历
  2. 深度优先遍历

可以进行标记

树的广度优先遍历,我们用了辅助的队列

bool visited[MAX_VERTEX_NUM] 	//访问标记数组
//广度优先遍历
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))
            if(!visited[w]){	//w为v的尚未访问的邻接顶点
                visit(w);		//访问顶点w
                visited[w]=TRUE;//对w做已访问标记
                EnQueue(Q,w);	//顶点w入队列
            }
    }
}

存在问题:如果是非连通图,则无法遍历完所有结点

解决:判断数组里还有没有false的元素

void BFSTraverse(Graph G){
    for(i=0;i<G.vexnum;++i)
        visited[i] = FALSE;
    InitQueue(Q);
    for(i=0;i<G.vexnum;++i){
        if(!visited[i])
            BFS(G,i);
    }
}

对于无向图来说,调用bfs函数的次数=连通分量数

复杂度分析

广度优先生成树

广度优先生成森林

$flag 上一页 下一页