双向广度优先搜索算法

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

首先是广度优先搜索算法

初始化visited数组,将所有点的值设为false;//visited数组用来保存所有点的访问情况
visited[start]=true;//start为起始点
queue 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 frontSearch;//记录从前向后搜索的队列
queue 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;
    }

}

 

你可能感兴趣的:(CCFCSP)