双向广度优先搜索算法

本文详细介绍了广度优先搜索算法和双向搜索算法的实现过程。广度优先搜索通过初始化visited数组,使用队列保存待搜索点,从起始点开始逐层向外扩展搜索。双向搜索则从起始点和终点同时进行搜索,当两个方向的搜索路径交汇时,算法结束并返回总步数。两种算法在解决复杂路径寻找问题中具有重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自http://www.cppblog.com/tortoisewu/archive/2009/05/29/86123.aspx

首先是广度优先搜索算法

初始化visited数组,将所有点的值设为false;//visited数组用来保存所有点的访问情况
visited[start]=true;//start为起始点
queue<type> search;//用来保存待搜索点的队列
search.push(start);
while(!search.empty())
{
      v=search.front();
      search.pop();   //弹出一个点处理,用v表示
      for(每一个v的相邻点)
         if(!visited[v]){
            visited[v]=true;
            search.push(v);
         }
}

然后是双向搜索,基本思想是从结束状态与开始状态同时搜索,搜到相同点时停止

if(start==finish)
      return 0;
初始化visited数组里每个值为0; //这里visited值为1则为向后搜索过的值,为2则为向前搜索过的值
初始化起始点start.step=true; //这里step属性为真则表示为某一搜索步数中的最后一个点,例如对于poj1915中第2步有八个点,只有第八个点的step为true,其余为false
初始化目标点finish.step=true;
visited[start]=true;
visited[finish]=true;
queue<type> frontSearch;//记录从前向后搜索的队列
queue<type> backSearch;//记录从后向前搜索的队列
fstep=0;//记录从前向后搜索的步数
bstep=0;//记录从后向前搜索的步数
frontSearch.push(start);
backSearch.push(finish);
while(!frontSearch.empty() || !backSearch.empty()){
    if(!frontSearch.empty()){
        do{
            current=frontSearch.front();//从队列中弹出当前搜索的点
            frontSearch.pop();
            for(每一个current的相邻点v){
            if(visited[v]==2)
                return fstep+bstep+1;//如果遇到了从后向前搜索搜过的点则终止,并且返回总步数
                if(!visited[v]){
                    visited[v]=1;
                    frontSearch.push(v);
                }
            }
        }while(!current.step);//同一步的点已经全部搜完,结束循环
        fstep++;//增加从前向后搜索的步数
        current=frontSearch.front();
        frontSearch.pop();
        current.step=true;
        frontSearch.push(current);//将当前步数最后一个点的step属性设为true;
    }
    if(!backSearch.empty()){
        do{
            current=backSearch.front();//从队列中弹出当前搜索的点
            backSearch.pop();
            for(每一个current的相邻点v){
                if(visited[v]==1)
                    return fstep+bstep+1;//如果遇到了从前向后搜索搜过的点则终止,并且返回总步数
                if(!visited[v]){
                    visited[v]=2;
                    backSearch.push(v);
                }
            }
        }while(!current.step);//同一步的点已经全部搜完,结束循环
        bstep++; //增加从后向前搜索的步数
        current=backSearch.front();
        backSearch.pop();
        current.step=true;
        backSearch.push(current);//将当前步数最后一个点的step属性设为true;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值