双向搜索(bfs,dfs)
双向搜索的基本思路:
双向搜索
从状态图上的起点和终点同时开始进行广搜或深搜,如果发现搜索的两端相遇了,那么可以认为是获得了可行解
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)相关推荐
- 邻结矩阵的建立和 BFS,DFS;;
邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...
- [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]
[问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...
- LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...
- LeetCode 1034. 边框着色(BFS/DFS)
文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色. 只有当两个网格块的颜色相同,而且在四个方向中任 ...
- 全局路径规划:图搜索算法介绍1(BFS/DFS)
对于全局路径规划的设计,我们先要了解什么是图搜索,在此之前,要先知道什么是图: 可以看到,图有很多种,有无向图,有向图,节点之间还可以有不同的weight, 用于表述从节点与节点直接迁移的代价. 而图 ...
- 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...
java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...
- 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)
前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...
- bfs dfs 搜索入门模板题
bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...
- 动态规划+BFS+DFS+回溯+红黑树+排序+链表+位运算(B站优质学习资源链接,后续会继续更新)
动态规划 正月点灯笼(UP主) 个人主页 https://space.bilibili.com/24014925/channel/detail?cid=12580 动态规划第一讲 https://ww ...
最新文章
- ios滚动条影响父页面 vue_父元素设置overflow:scroll时vuedraggable组件出现奇怪效果的解决方案...
- [转]MSXML版本历史
- IntelliJ IDEA for Mac 在MacOS模式下的注释快捷键(Comment Shortcut)
- 现代程序设计 作业6 - 简单而有意义的题目
- 2个html文件顺序播放,CSS3两个动画顺序衔接播放
- python numpy 生成矩阵_Python numpy生成矩阵、串联矩阵代码分享
- stb_image 读写
- 【深度一键还原】我的台式机
- Eclipse调试:改变颜色, 背景与字体大小 和xml字体调整
- 世界上最好玩的6种表情符号编程语言
- gd32f450 linux,GD32F450开发板初体验
- 中国矿业大学本科毕业设计Latex模板cumtthesis
- 离散数学中关于自反与反自反的通俗解释
- 详解win10装回win7不开机的原因和解决方法
- mysql-mmm vip 切换问题_mysql-mmm复制延迟的想法
- 姜小白的Python日记Day15 系统模块详解2 sys模块和os模块
- 关于纹理勾选sRGB的疑惑
- Css3中添加-moz-, -webkit-, -o-,是什么意思呢?
- 拼多多API根据ID获取商品详情
- python毒酒检测_一道著名的毒酒问题