双向搜索的基本思路:

双向搜索

从状态图上的起点和终点同时开始进行广搜深搜,如果发现搜索的两端相遇了,那么可以认为是获得了可行解

BFS例题:

字串变换

代码:

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>
#define  SI unordered_map<string, int>
using namespace std;const int N = 6;int n;
string a[N], b[N];int extend(queue<string>& q, SI& da, SI& db, string a[], string b[]){//一次遍历一层,大小为q.size()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;//分别从起点,终点开始的队列SI da, db;//每个状态到起点的距离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;
}

DFS例题:

送礼物

思路:

双向搜索,先将一部分的礼物能出现的组合打表,对于后一部分,搜索到一种组合后,再在前一部分的组合中找合适的组合,两个组合加起来重量<=w,取max就是答案

代码:

#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 46;int n, m, k;
int w[N];
int weights[1 << 25], cnt = 1;
int ans;void dfs1(int u, int s){//第一次爆搜if (u == k){weights[cnt ++ ] = s;return;}dfs1(u + 1, s);//不放if ((LL)s + w[u] <= m) dfs1(u + 1, s + w[u]);//放进去(带剪枝)
}void dfs2(int u, int s){if (u == n){int l = 0, r = cnt - 1;while (l < r){int mid = l + r + 1 >> 1;if ((LL)s + weights[mid] <= m) l = mid;else r = mid - 1;}ans = max(ans, s + weights[l]);return;}dfs2(u + 1, s);//不放if ((LL)s + w[u] <= m) dfs2(u + 1, s + w[u]);//放进去(带剪枝)
}int main(){cin >> m >> n;for (int i = 0; i < n; i ++ ) cin >> w[i];sort(w, w + n);reverse(w, w + n);//实践出真理,用n/2+2代替n/2竟然可以快500+ msk = n / 2 + 2;dfs1(0, 0);sort(weights, weights + cnt);//去重+得到数量(unique返回类似指针的迭代器)cnt = unique(weights, weights + cnt) - weights;dfs2(k, 0);cout << ans << endl;return 0;
}

双向搜索(bfs,dfs)相关推荐

  1. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  2. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  3. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  4. LeetCode 1034. 边框着色(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色. 只有当两个网格块的颜色相同,而且在四个方向中任 ...

  5. 全局路径规划:图搜索算法介绍1(BFS/DFS)

    对于全局路径规划的设计,我们先要了解什么是图搜索,在此之前,要先知道什么是图: 可以看到,图有很多种,有无向图,有向图,节点之间还可以有不同的weight, 用于表述从节点与节点直接迁移的代价. 而图 ...

  6. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  7. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  8. bfs dfs 搜索入门模板题

    bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...

  9. 动态规划+BFS+DFS+回溯+红黑树+排序+链表+位运算(B站优质学习资源链接,后续会继续更新)

    动态规划 正月点灯笼(UP主) 个人主页 https://space.bilibili.com/24014925/channel/detail?cid=12580 动态规划第一讲 https://ww ...

最新文章

  1. ios滚动条影响父页面 vue_父元素设置overflow:scroll时vuedraggable组件出现奇怪效果的解决方案...
  2. [转]MSXML版本历史
  3. IntelliJ IDEA for Mac 在MacOS模式下的注释快捷键(Comment Shortcut)
  4. 现代程序设计 作业6 - 简单而有意义的题目
  5. 2个html文件顺序播放,CSS3两个动画顺序衔接播放
  6. python numpy 生成矩阵_Python numpy生成矩阵、串联矩阵代码分享
  7. stb_image 读写
  8. 【深度一键还原】我的台式机
  9. Eclipse调试:改变颜色, 背景与字体大小 和xml字体调整
  10. 世界上最好玩的6种表情符号编程语言
  11. gd32f450 linux,GD32F450开发板初体验
  12. 中国矿业大学本科毕业设计Latex模板cumtthesis
  13. 离散数学中关于自反与反自反的通俗解释
  14. 详解win10装回win7不开机的原因和解决方法
  15. mysql-mmm vip 切换问题_mysql-mmm复制延迟的想法
  16. 姜小白的Python日记Day15 系统模块详解2 sys模块和os模块
  17. 关于纹理勾选sRGB的疑惑
  18. Css3中添加-moz-, -webkit-, -o-,是什么意思呢?
  19. 拼多多API根据ID获取商品详情
  20. python毒酒检测_一道著名的毒酒问题

热门文章

  1. 计算机自动计算的条件,电脑表格怎样自动计算
  2. c语言基础知识选择题,C语言基础知识选择试题.doc
  3. 简易理解设计模式之:责任链模式——OA中请假流程示例
  4. 并行测试和变异测试三篇文献总结(二)
  5. 软件系统三员管理_3个可怕的系统管理员故事
  6. android手机用户,ZDC:2011年Android手机用户使用行为研究报告
  7. 企业网络及应用层安全防护技术精要(Part I)
  8. Ethercat 从站开发总结一:协议总结
  9. 李理:详解卷积神经网络
  10. OBS软件转发直播他人直播画面方式方法(包含插件下载地址)