图的遍历-广度优先遍历

版权声明:转载请注明出处。 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);
				  }
			   }
		   }
	   }
   }
}

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/83031407