双向广搜-BiDirectional BFS

news/2025/3/28 9:01:07/文章来源:https://www.cnblogs.com/kkman2000/p/18792706

双向广搜

文章目录

前言

 

前言

复习acwing算法提高课的内容,本篇为讲解算法:双向广搜 

 

一、双向广搜

双向广搜其实就是两个bfs,我们知道bfs是一种暴力的做题方法,搜索树长下图所示:

我们会发现搜索树越来越宽,每一层的搜索量增加,如果数据范围很大的话,显然是会TLE的,那么为了避免TLE,我们可以采用双向广搜,即两个bfs,如下图所示:

 

这个样子就可以省去很多不必要的搜索量,我们在这个基础上可以再次优化,每次只bfs一次,每次bfs那个队列容量少的部分。


二、AcWing 190. 字串变换

本题链接:AcWing 190. 字串变换

本博客提供本题截图:

 

 

本题分析

定义两个队列,分别表示开始和末尾,进行双向广搜,我们每次挑出来含元素少的队列进行bfs,qa表示从起始位置开始的bfs,qb表示的是从结尾开始的bfs,da表示的距离是从起始到当前的距离,db表示的距离是从结尾到当前的距离,extend表示的是扩展的过程,这里需要注意的话如果是对qb执行extend操作的话,是把b变成a

 

对于extend操作:

if (da.count(state)) continue;
if (db.count(state)) return da[t] + 1 + db[state];
 
 

如果state出现在da,那么证明被更新过,直接continue这种情况

如果state出现在db,那么证明已经找到了最后的结果,即双向光搜碰头了,那么就把距离返回给main

AC代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>using namespace std;const int N = 6;int n;
string a[N], b[N];int extend(queue<string>& q, unordered_map<string, int>& da, unordered_map<string, int>& db, string a[], string b[])
{for (int k = 0, sk = q.size(); k < sk; k ++ ){string t = q.front();q.pop();for (int i = 0; i < t.size(); i ++ )for (int j = 0; j < n; j ++ )if (t.substr(i, a[j].size()) == a[j]){string state = t.substr(0, i) + b[j] + t.substr(i + a[j].size());if (da.count(state)) continue;if (db.count(state)) return da[t] + 1 + db[state];da[state] = da[t] + 1;q.push(state);}}return 11;
}int bfs(string A, string B)
{queue<string> qa, qb;unordered_map<string, int> da, db;qa.push(A), da[A] = 0;qb.push(B), db[B] = 0;while (qa.size() && qb.size()){int t;if (qa.size() <= qb.size()) t = extend(qa, da, db, a, b);else t= extend(qb, db, da, b, a);if (t <= 10) return t;}return 11;
}int main()
{string A, B;cin >> A >> B;while (cin >> a[n] >> b[n]) n ++ ;int step = bfs(A, B);if (step > 10) puts("NO ANSWER!");else printf("%d\n", step);return 0;
}
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读DAMA数据管理知识体系指南31参考数据和主数据概念(上)

读DAMA数据管理知识体系指南31参考数据和主数据概念(上)1. 业务驱动因素 1.1. 满足组织数据需求1.1.1. 组织中的多个业务领域需要访问相同的数据集,并且他们都相信这些数据集是完整的、最新的、一致的1.2. 管理数据质量1.2.1. 数据的不一致、质量问题和差异均会导致决策错误…

生成式 AI 和 LLM 简介 起源 历史记录

领域 年份 定义人工智能 (AI) 1956 计算机科学领域,旨在创造能够复制或超越人类智能的智能机器。机器学习 (Machine Learning) 1997 人工智能的子集,使机器能够从现有数据中学习并根据这些数据进行决策或预测。深度学习 (Deep Learning) 2012 一种机器学习技术,通过使用多层…

拿到代理对象,如何调用增强方法

步骤1 前面已经创建了MathCal的代理对象了,我们在调用方法时加一个断点这里返回的确实是代理对象,这个对象中保存了详细信息(增强器,原始对象等),我们进入bean.add(2, 10) 中,来到 org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept(…

如何保证消息队列的消息只能被消费一次

如何保证消息队列的消息只能被消费一次,首先先保证消息不会丢失 首先先生产者到消费者到消费者有哪些场景会消息丢失一、问题场景 场景一、生产者发送到消息队列失败 场景二、消息队列接受到消息磁盘化失败 场景三、消费者接受到消息消费失败 二、场景原因,如何解决 1、场景一…

Day22_java方法

Java方法 方法重载 package com.xiang.method;public class Demo02 {public static void main(String[] args) {int max = max(20, 100, 10);System.out.println(max);}// 比大小public static int max(int num1,int num2){int result = 0;if (num1 == num2){System.out.printl…

文献阅读《Spectral Networks and Deep Locally Connected Networks on Graphs》

参考博客 第一代图卷积网络:图的频域网络与深度局部连接网络 - 知乎 (zhihu.com) 论文解读一代GCN《Spectral Networks and Locally Connected Networks on Graphs》 - 别关注我了,私信我吧 - 博客园 (cnblogs.com) 论文核心 卷积神经网络得益于所处理的数据具有局部平移不变…

【CodeForces训练记录】Codeforces Round 1013 (Div. 3)

训练情况赛后反思 A题题目读半天,发现日期有前导零,div3还是比较基础一点,但是感觉自己还是不够熟练,D题看出来二分但是调了挺久的 A题 判断取多少个数之后才能构成 20250301,我们维护数字的出现次数,直到所有数字的出现次数全部大于等于 20250301 的出现次数时输出位置即…

字符串问题的江湖奇宝:进制哈希

江湖中,剑客以快制胜,而算法竞赛里,字符串哈希(String Hashing)便是那柄出招如电的快剑。 各种字符串问题纷乱复杂,各种字符串算法招式繁复,需苦练内功心法。但字符串哈希算法却只凭一招:将字符串化作数字,以数论为刃,至简之道斩尽来犯之敌。 但此招并非无懈可击。若…

HW-1

1.选项A是正确的,它表示的是极小项m6的正确形式。极小项m6对应的是变量a=0,b=1,c=1,d=0的情况,因此其表达式应为(\overline{a} \cdot b \cdot c \cdot \overline{d}),即选项A。 其他选项的分析:选项B是一个或项,不符合极小项的定义。 选项C缺少变量a和d,不是一个完整的…

为什么nn.Linear 的weight 是 (out_features, in_features)

在PyTorch的nn.Linear中,权重矩阵的形状为(out_features, in_features)。这是因为线性变换的实现方式为:具体来说:当创建nn.Linear(10, 60)时,in_features=10,out_features=60,因此权重的形状是(60, 10)。 输入张量t的形状为(2, 5, 10),与转置后的权重a.weight.T(形状(…

字符串问题的终极法宝:进制哈希

江湖中,剑客以快制胜,而算法竞赛里,字符串哈希(String Hashing)便是那柄出招如电的快剑。 各种字符串问题纷乱复杂,各种字符串算法招式繁复,需苦练内功心法。但字符串哈希算法却只凭一招:将字符串化作数字,以数论为刃,至简之道斩尽来犯之敌。 但此招并非无懈可击。若…