• 双向BFS


    void BFS_bothsides()//双向BFS 
    {
        if(s1.state==s2.state)//起点终点相同时要特判
        {
               //do something
               found=true;
               return;
        }
        bool found=false;
        memset(visited,0,sizeof(visited));  // 判重数组
        while(!Q1.empty())  Q1.pop();   // 正向队列
        while(!Q2.empty())  Q2.pop();  // 反向队列
        //======正向扩展的状态标记为1,反向扩展标记为2
        visited[s1.state]=1;   // 初始状态标记为1
        visited[s2.state]=2;   // 结束状态标记为2
        Q1.push(s1);  // 初始状态入正向队列
        Q2.push(s2);  // 结束状态入反向队列
        while(!Q1.empty() || !Q2.empty())
        {
               if(!Q1.empty())
                      BFS_expand(Q1,true);  // 在正向队列中搜索
               if(found)  // 搜索结束 
                      return ;
              if(!Q2.empty())
                      BFS_expand(Q2,false);  // 在反向队列中搜索
               if(found) // 搜索结束
                      return ;
        }
    }
    void BFS_expand(queue<Status> &Q,bool flag)
    {  
         s=Q.front();  // 从队列中得到头结点s
         Q.pop()
         for( 每个s 的子节点 t )
        {
            t.state=Gethash(t.temp);  // 获取子节点的状态
            if(flag)   // 在正向队列中判断
            {
                   if(visited[t.state]!=1)// 没在正向队列出现过
                {
                    if(visited[t.state]==2)  // 该状态在反向队列中出现过
                      {
                        各种操作;
                        found=truereturn;
                    }
                    visited[t.state]=1;   // 标记为在在正向队列中
                    Q.push(t);  // 入队
                   }
            }
            else    // 在正向队列中判断
            {
                if (visited[t.state]!=2) // 没在反向队列出现过
                 {
                    if(visited[t.state]==1)  // 该状态在正向向队列中出现过
                    {
                        各种操作;
                        found=truereturn;
                    }
                    visited[t.state]=2;  // 标记为在反向队列中
                    Q.push(t);  // 入队
                }
            }
        }
    }
  • 相关阅读:
    虚拟机下unbuntu上网
    Ubuntu 用户切换和管理
    Brew程序模拟器上运行出现中文乱码
    struts2+spring+hibernate实例
    ubuntu ip设置
    JavaScript常用总结
    C++动态创建二维数组和清空cin缓冲
    🍖类的组合
    🍖鸭子类型
    🍖类的多态与多态性
  • 原文地址:https://www.cnblogs.com/tianyudizhua/p/15554923.html
Copyright © 2020-2023  润新知