搜索
文章平均质量分 75
荼白777
这个作者很懒,什么都没留下…
展开
-
IDA*例题 & IDA* 与 A*使用时机
引入思想类似于A*算法;一般配合迭代加深使用;主要思想是,引入一个估价函数,看看当前状态距离答案最少还需要多少步;如果当前的深度加上预估的步数已经超过当前的max_depth;那么就可以剪枝掉;估价函数怎么取估价函数也和A*类似,取一个无论如何都要付出的最小代价即可;保证正确性和A*算法一样,只需要保证预估值小于等于真实值即可;简单来说简单来说,IDA*就是在迭代加深的时候,增加了一个额外的剪枝;这个剪枝就是加上估价值来判断是否超过max_depthIDA* 与 A*使用时机原创 2021-11-12 16:46:35 · 723 阅读 · 0 评论 -
双向DFS例题
引入原理跟双向BFS是一样的;这里不再过多介绍;核心思想都是避免搜索过多的空间,而双向搜索则可以保证在空间较少的地方相遇;例题送礼物题面原创 2021-11-12 14:10:05 · 558 阅读 · 0 评论 -
DFS迭代加深例题
引入有些时候答案在深度比较浅的位置,而像我们传统的dfs会先搜索到深的位置,导致浪费很多时间;比如下图中,打星的地方代表答案;迭代加深有点类似bfs,但是有些题目bfs是做不了的;我们每次给定一个max_depth,超过这个深度就先剪掉;然后一圈圈的往外扩展;这tm不就是bfs跟bfs同理,第一次搜到的就是最小的答案;与BFS区别?BFS是用一个队列,每一次都将下一层信息全部扩展进来;因此需要的空间是指数级别的;而迭代加深本质上还是DFS,他每一次只会记录一条路径;因此需要的空间原创 2021-11-12 00:03:05 · 654 阅读 · 0 评论 -
DFS剪枝例题
常见的剪枝方式一、优化搜索顺序大部分情况下,我们应该优先搜索分支较少的结点;在没有剪枝的情况下,因为最终都会枚举完全部的点,所以是一样的;但是在有剪枝的情况下,走分支较少的点,剪枝的效果更明显;如下图所示,红色勾起来的代表剪枝处;二、排除等效冗余简单来说,如果不考虑顺序,那么优先考虑组合,而不要考虑排列;即不要搜索重复状态;比如现在有<1,2>和<2,1><1,2>和<2,1><1,2>和<2,1>,不考虑顺序的话,原创 2021-11-09 13:22:34 · 1040 阅读 · 0 评论 -
DFS之搜索顺序例题
例题马走日题面传送门思路这题问的是方案数,因此我们需要回溯;Code#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;const int N = 1e1 + 10;int dx[] = {-2,-1,2,1,2,1,-1,-2};int dy原创 2021-11-07 20:18:41 · 99 阅读 · 0 评论 -
连通性DFS例题
引入跟BFS一样,DFS同样能解决连通性的问题;但是DFS第一次走到某个点的时候,它的距离不一定是最短的;而BFS则可以保证;DFS只能保证某两个点是否连通;例题迷宫思路需要注意起点和终点可能是障碍物,题目没有保证不是;因为我们只需要判断是否连通,因此每个点走一次即可;Code#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>原创 2021-11-07 12:48:04 · 119 阅读 · 0 评论 -
BFS A*优化模板 && 普通BFS、A*BFS判重对比
引入A*算法主要思想是尽可能减少搜索空间;我觉得A*算法和迪杰斯特拉算法真的很像;具体看下面;一般思路将BFS中的队列换成优先队列,这里我们使用小根堆来实现;队列中存放的值为起点到当前点的真实距离与当前点到终点的估计距离;这个估计距离是由我们写的一个估价函数来算的;为什么说A*和迪杰斯特拉很像;因为迪杰斯特拉不就是把估计距离当作零吗?保证正确性设g(i)g(i)g(i)表示点iii到终点的真实距离;f(i)f(i)f(i)表示点iii到终点的估计距离;只要保证f(i)≤g(i)f原创 2021-10-27 22:00:31 · 296 阅读 · 0 评论 -
双向BFS例题
引入双向BFS指的是,从起点和终点同时往中间搜;这种搜法是对普通BFS的一个优化;下面是单向BFS和双向BFS的直观感受;应用场景一般应用于需要将整体抽象成一个状态的搜索;因为这样的搜索状态很多,直接单向搜的话,可能会TLE、MLE;比如魔板、字串变换;而像武士风度的牛(求最短路)、城堡问题(求连通块及其大小)的优化效果不明显;实现方式方式一、起点扩展一层、终点扩展一层,以此类推;方式二、相对于方式一是一个优化;从当前状态较少的一边开始搜,避免极端情况(即一边状态很多,一边状原创 2021-10-27 15:45:40 · 329 阅读 · 0 评论 -
电路维修 ——双端队列广搜(01BFS)模板
引入当边权只有000和111的时候,我们可以使用双端队列广搜的这种方法;这种方法和普通的BFS的唯一区别在于;当入队的元素边权为000,那么插到队头;当入队的元素边权为111,那么插到队尾;并且出队的时候从队头出队;其他与普通的BFS并无区别;例题电路维修思路首先,因为我们只能走斜线,因此横纵坐标同时改变111;因此横纵坐标之和为偶数的点,必然只能到偶数;横纵坐标之和为奇数的点,必然只能到奇数;将需要反转的线视为边权为1、不需要反转的线视为边权为0;然后进行01BFS即原创 2021-10-25 20:39:40 · 248 阅读 · 0 评论 -
魔板 —— BFS最小步数
题面题目思路我们将整个魔板看成一个点(或者说一个状态);然后对它进行A、B、C三种操作得到下一个状态;这样我们就可以用BFS来解决;将整个板子看成一个状态,我们可以先将整个板子拉成一条线;用一个字符串来存储;然后用哈希表来存即可;Code#include <iostream>#include <cstdio>#include <string>#include <queue>#include <utility>#原创 2021-10-25 12:41:00 · 71 阅读 · 0 评论 -
矩阵距离 —— 多源BFS模板
引入在图论中,我们想求某个节点到很多节点的最短距离,即求某个节点距离它最近的起点的距离是多少;注意:不是多源最短路(floyd),Floyd是求任意两个节点的;我们可以将这个问题转化为单源最短路;只需要构建一个虚拟源点;将这个虚拟源点向每个起点连一条边权为0的边;然后求某个点到虚拟源点的最短距离即可;因为虚拟源点到我们这个点求最短路的时候会考虑每个分支;那么虚拟源点求单源最短路和我们求距离最近的起点就是一回事了;多源BFS思想思想和上面提到的建立虚拟源点类似;但是我们并不需要原创 2021-10-25 09:57:30 · 90 阅读 · 0 评论 -
BFS Flood Fill(连通性) 例题
题面城堡问题Flood Fill介绍Flood Fill应用的题型主要在于求连通块的题目;Code#include <iostream>#include <cstdio>#include <algorithm>#include <utility>#include <queue>using namespace std;typedef long long ll;const int N = 1e2 + 10;int原创 2021-10-19 13:39:32 · 248 阅读 · 0 评论