版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/83031407
广度优先遍历类似于树的按层次遍历的过程。
规则:访问v,访问v的各未访问的邻接点,之后逐个从这些邻接点出发重复上述操作。待与v连通的顶点访问毕再从另一顶点出发。
实现:对各个顶点v,若其尚未访问则访问,之后v入队,队顶元素出队,逐个访问其尚未访问的邻接点,每的访问完一个便入队。重复直到队空。
算法实现:
邻接矩阵存储:
void BFSTraverse(MGraph G,Status (*visit)(MGraph G,int v)){
/*图的广度优先遍历
访问v 访问v的各为访问的邻接点 之后逐个从这些邻接点出发重复上述操作
待与v连通的顶点访问毕再从另以顶点出发 对各个顶点v 若其尚未访问则访
问v 之后v入队 对顶元素出队 逐个访问其尚为访问的邻接点,每访问完一个
就入队 重复直到队列空
每个顶点进一次队 出队时主要操作查找邻接点*/
int v;
LinkQueue Q;
InitQueue(Q);
for(v=0;v<G.vexnum;v++) //初始化
visited[v]=FALSE;
for(v=0;v<G.vexnum;v++){
if(!visited[v]){
visit(G,v);
visited[v]=TRUE;
EnQueue(Q,v);
while(!QueueEmpty(Q)){
DeQueue(Q,v);
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) {
if(!visited[w]) {
visit(G,w);
visited[w]=TRUE;
EnQueue(Q,w);
}
}
}
}
}
}
邻接表存储:
void BFSTraverse(ALGraph G,Status (*visit)(ALGraph G,int v)){
/*图的广度优先遍历
访问v 访问v的各未访问的邻接点,之后逐个从这些邻接点出发重复上述操作
待与v连通的顶点访问毕再从另以顶点出发 对各个顶点v 若其尚未访问则访
问v 之后v入队 对顶元素出队 逐个访问其尚为访问的邻接点,每访问完一个
就入队 重复直到队列空
每个顶点进一次队 出队时主要操作查找邻接点*/
int v,w;
LinkQueue Q;
InitQueue(Q);
for(v=0;v<G.vexnum;v++)//初始化
visited[v]=FALSE;
for(v=0;v<G.vexnum;v++){
if(!visited[v]){
visit(G,v);
visited[v]=TRUE;
EnQueue(Q,v);
while(!QueueEmpty(Q)){
DeQueue(Q,v);
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
if(!visited[w]) {
visit(G,w);
visited[w]=TRUE;
EnQueue(Q,w);
}
}
}
}
}
}