图的宽度优先搜索和二叉树的层次遍历很像,是一种按层次往外扩展的遍历。其实很简单,自然要用到一个队列,因为FIFO的性质简直就是为层次遍历而生的。
用一个队列记录正在访问的节点的邻接节点,把当前节点的邻接节点全部放到队列后面,在队列中删除当前访问节点。这样队列中的节点顺序就是层次遍历的顺序了。
void BFS(Graph g,int v,bool *visited)
{
ENode *w;
int u;
Queue q;
visited[v]=true;
cout<<v;
q.push(v);//v进入队列
while(!q.empty())
{
u=q.front();//u存放队列头元素
q.pop();//删除队列头元素
for(w=g.A[u];w;w=w->NextArc)
{
if(!visited[w->AdjVex])
{
cout<<w->AdjVex;
visited[w->AdjVex]=true;
q.push(w->AdjVex);
}
}
}
}
void Traversal_BFS(Graph g)
{
bool visited[MaxSize];
int n=g.Vertices;
for(int i=0;i<n;i++)
{
visited[i]=false;
}
for(int i=0;i<n;i++)
{
if(!visited[i])
BFS(g,i,visited);
}
}
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> que;
que.push(1);
cout<<"队列第一个元素"<<que.front()<<endl;
cout<<"队列大小"<<que.size()<<endl;
que.push(2);
cout<<"队列尾部元素"<<que.back()<<endl;
cout<<"队列大小"<<que.size()<<endl;
que.pop();
cout<<"弹出队顶元素后的第一个元素"<<que.front()<<endl;
return 0;
}