宽度优先搜索bfs

好吧,今天看了bfs,其实发现基本思想也是不过如此。只是,应用还是不太会。
bfs是宽度优先,从根节点开始,依次访问它的所有邻接点,然后再按顺序访问邻接点的邻接点,先被访问的点的邻接点先被访问。由于要按这样的顺序访问,所以需要用到队列。


求最短路径和迷宫类型的题目都可以利用Bfs.

下面是基本步骤:
1)从图中的某个顶点v出发,访问v。
2)依次访问V的各个没有被访问过的邻接点。
3)分别从这几个邻接点出发访问他们的邻接点,先被访问的顶点的邻接点先于后被访问的邻接点。重复步骤3)直到图中所有顶点都被访问。


对于队列的使用:
1)先把根节点加入队列。
2)只要队列不为空,就要重复这样的操作:
                            队头顶点u出列,如果visit[w]显示u的邻接点w没有被访问过,那么访问w,并置visit[w]标记已经访问过,然后w进队列,这样就可以保证寻找邻接点的次序。

#include<iostream>  
#include<queue>      
using namespace std;  
  
int a[11][11];  
bool visited[11];  
  
void store_graph()  //用邻接矩阵存储图  
{  
    for(int i=1;i<=10;i++)  
        for(int j=1;j<=10;j++)  
            cin>>a[i][j];  
}  
  
void bfs_graph()    //遍历图  
{  
    void bfs(int v);  //函数调用声明
  
    memset(visited,false,sizeof(visited));  
  
    for(int i=1;i<=10;i++)    
        if(visited[i]==false)  
            bfs(i);  
}  
  
void bfs(int v) //广度优先搜索 
{  
    int Adj(int x);  //函数调用声明
  
    queue<int> myqueue; //定义一个队列来存储结点 
    int adj,temp;  
  
    cout<<v<<" ";  
    visited[v]=true;//标记已经被访问过  
    myqueue.push(v);  
  
    while(!myqueue.empty())    //队列非空表示还有顶点未遍历到  
    {  
        temp=myqueue.front();  //获得队列头元素  
        myqueue.pop();         //头元素出队 
  
        adj=Adj(temp); //邻接点编号 
        while(adj!=0)  
        {  
            if(visited[adj]==false)  
            {  
                cout<<adj<<" ";  
                visited[adj]=true;  
                myqueue.push(adj);   //进队
            }  
  
            adj=Adj(temp);  
        }  
    }  
}  
  
int Adj(int x)    //求X的邻接点 
{  
    for(int i=1;i<=10;i++)  
        if(a[x][i]==1 && visited[i]==false)  
            return i;  
  
    return 0;  
}  
  
int main()  
{  
    cout<<"初始化图:"<<endl;  
    store_graph();  
  
    cout<<"bfs遍历结果:"<<endl;  
    bfs_graph();  
  
    return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值