广度优先遍历(Breadth-First-Search,BFS)要点:
1.找到与一个顶点相邻的所有顶点·
2.标记哪些顶点被访问过
3.需要一个辅助队列
- FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。
- NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
遍历序列的可变性
①使用邻接矩阵表示的图的广度优先遍历序列唯一
②使用邻接表表示的图的广度优先遍历序列不唯一
对于无向图,调用BFS函数的次数=连通分量数
bool visited[Max_VERTEX_NUM]; //访问标记数组
void BFSTraverse(Graph G){ //对图G进行广度优先遍历
for(int i=0;i<G.vexnum;++i){
visited[i] = false; //访问标记数组初始化
}
InitQueue(Q); //初始化辅助队列
for(int 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的尚未访问的邻接点
visit(w); //访问顶点w
visited[w] = true; //对w做已访问标记
EnQueue(Q,w); //顶点w入队列
}
}
}
}
空间复杂度:最坏情况,辅助队列大小为O(|V|)
邻接矩阵存储的图:
访问|V|个顶点需要O(|V|)的时间
查找每个顶点的邻接点都需要O(|V|)的时间,而总共有|V|个顶点
时间复杂度=O(|V|2)
邻接表存储的图:
访问|V|个顶点需要O(|V|)的时间
查找各个顶点的邻接点共需要O(|E|)的时间,
时间复杂度=O(|V|+|E|)
广度优先生成树:
由广度优先遍历确定的树;
邻接表存储的图的表示方式不唯一,遍历序列、生成树也不唯一;
遍历非连通图可得广度优先生成森林
版权声明:本文为qq_30581791原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。