图的宽度优先搜索(BFS)以及C++队列知识复习

来源:互联网 发布:宽带多重网络怎么回事 编辑:程序博客网 时间:2024/06/13 22:54

图的宽度优先搜索和二叉树的层次遍历很像,是一种按层次往外扩展的遍历。其实很简单,自然要用到一个队列,因为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;}


原创粉丝点击