广度优先搜索的优化与技巧

本文探讨了广度优先搜索(BFS)的优化方法,包括普通BFS、双向BFS以及使用双端队列的BFS。通过双向搜索,可以节省一半的搜索量,提高搜索效率。而在某些情况下,如边权为0或1的图,使用双端队列可以替代优先队列,简化排序操作,进一步优化算法。文中给出了相关例题代码以说明这些优化技巧。
摘要由CSDN通过智能技术生成

例题:P1397 八数码难题

普通BFS

在这里插入图片描述

双向BFS

在这里插入图片描述
所谓双向广度优先搜索指的是搜索沿两个方向同时进行
正向搜索:从初始点向目标点搜索;
逆向搜索:从目标点向初始点搜索;
从正反两个方向搜索,理论上可以节省二分之一的搜索量,从而提高搜索速度,节约内存空间。
从初始状态和目标状态向两个方向同时进行扩展,如果两颗解答树在某个节点发生一次重合,即可终止此搜索过程,则该节点所连接的两条路径所拼成的路径就是最优解
●双向广度优先搜索通常有两种搜索方法:
①、两个方向交替扩展;
②、选择结点个数较少的那个方向先扩展;
●实现方法:
建立两个队列分别拓展两个方向出发的状态。
每次while循环时只扩展正反两个方向中节点数目较少的一个,可以使两边的发展速度保持一定的平衡,从而减少总扩展节点的个数,加快搜索速度。
例题代码

#include<iostream>
#include<map>
#include<queue>
#include<cstring>
using namespace std;
map<string, int> ma,mb;
struct nod
{
   
    string a;
    int x, y;
};
queue<nod> qa,qb;
int dx[4] = {
   1, -1, 0, 0};
int dy[4] = {
   0, 0, 1, -1};

int main()
{
   
    string aim = "123804765",a;
    cin >> a;
    if(a==aim)
    {
   
        cout << "0";
        return 0;
    }
    for (int i = 0; i < 9;i++)
    {
   
        if(a[i]=='0')
            qa.push({
   a, i / 3, i % 3});
    }
    qb.push({
   aim, 1, 1});
    ma[a] = mb[aim] = 0;
    while(!qa.empty()||!qb.empty())
    {
   
        if(qa.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值