广度优先搜索遍历的原理:广度优先搜索算法遍历类似于树的按层次遍历。设图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后的下一个邻接顶点的序号
}
}
}