图的广度优先搜索遍历

          广度优先搜索遍历的原理:广度优先搜索算法遍历类似于树的按层次遍历。设图G的初态是所有顶点均未访问过,在G中任选一顶点vi为初始出发点,则广度优先搜索的基本思想是:首先访问出发点vi,接着依次访问vi的所有邻接点,再接着访问邻接着的所有未曾访问过的顶点,依次类推,直至图中所有和初始出发点vi有路径相通的顶点都已访问到为止。

         图的广度优先搜索遍历的算法:

         设vi和vj是俩个相继被访问过的顶点,若当前是以vi为出发点进行搜索,则在访问vi的所有未曾访问过的邻接接点之后,紧接着是以vj为出发点进行横向搜索,并对搜索到的vj的邻接点中尚未被访问的顶点进行访问。也就是说,先访问的顶点其邻接点亦先被访问。因此,需要进队列保存已访问过的顶点。

        

template<class T>
void AbstractGraph<T>::BFSTraverse(int v)  //从顶点v出发对非连通图进行一次广度优先搜索遍历
{
  bool *visited = new bool[VertexCount()];  //访问标记数组
  int i;
  for(i=0;i<VertexCount();i++)  //设置未访问标记
	  visited[i] = false;

  i = v;
  do{
     if(!visited[i])  //若顶点vi未被访问
	 {
		 cout<<"{";
		 breadthfs(i,visited);   //从顶点vi出发的广度优先搜索 遍历
		 cout<<"}";
	 }
	 i=(i+1)%VertexCount();  //在其他连通分量中寻找未被访问顶点
  }
  while(i!=v);
  cout<<endl;
  delete[]visited;
}


template<class T>
void AbstractGraph<T>::breadthfs(int v, bool visited[])  //从顶点v出发的一次广度优先搜索遍历
{
  cout<<Get(v)<<" ";
  visited[v] = true;
  SeqQueue<int> que(VertexCount());  //创建顺序队列
  que.enqueue(v);       //访问过的顶点v的序号入队
  while(!que.isEmpty())  //当队列不空时循环
  {
   v = que.dequeue();  //出队
   int w = GetFristNeighbor(v);  //获得顶点v的第一个邻接顶点序号
   while(w!=-1)
   {
	  
	  if(!visited[w])
	{
	  cout<<Get(w)<<" ";  //访问顶点
	  visited[w] = true ;
	  que.enqueue(w);  //访问过的顶点w的序号入队
	}
	w = GetNextNeighbor(v,w);   //返回v在w后的下一个邻接顶点的序号
  }
}
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/xiaohudeITmeng/article/details/74399747
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞