搜索
文章平均质量分 63
深搜和广搜都是对于状态进行枚举,个人认为深搜的思维难度更大。我觉得深搜意在找出一种方法能够表达出每个状态,可以看作树上的各个节点,我们可以通过传入深搜函数不同数和种类的参数来表达。之后我们要找出一般规律,每次递归的共同点。
Brightess
湖南城市学院在读,大四学生
展开
-
美团2017年CodeM大赛-资格赛 NC13224 送外卖(记忆化搜索 or 预处理 dfs)
记忆化搜索 or 预处理 dfs原创 2022-09-15 20:58:14 · 327 阅读 · 0 评论 -
AtCoder abc_264 C - Matrix Reducing(嵌套 dfs)
嵌套 dfs原创 2022-08-14 16:50:36 · 418 阅读 · 0 评论 -
Atcoder Beginner 202 E - Count Descendants(离线查询 重链剖分树上启发式合并)
dsu on tree 离线查询,为了补这道题花时间学了下 树链剖分 和 dsu on tree原创 2022-07-21 18:39:29 · 211 阅读 · 0 评论 -
启发式合并(含一般式、树上启发式合并 例题)
一般式启发式合并、dsu on tree原创 2022-07-21 12:23:10 · 1867 阅读 · 1 评论 -
洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)
欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有 nnn 个等待点,有 n−1n-1n−1 条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币。参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有足够多的游戏币(用于支付使用道路的花费)、地图(标明等待点之间道路连接的情况)以及对话机(用于和同组的成员联系)。当集合号吹响后,每组成员之间迅速联系,了解到自己组所有成员所原创 2022-06-30 19:57:25 · 291 阅读 · 0 评论 -
洛谷 P3398 仓鼠找 sugar(树上倍增 lca 判断树中两条路径是否相交 结论)
小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧!第一行两个正整数n和q,表示这棵树节点的个数和询问的个数。接下来n-1行,每行两个正整数u和v,表示节点u到节点v之间有一条边。接下来q行,每行四个正整数a、b、c和d,原创 2022-06-30 15:42:30 · 250 阅读 · 0 评论 -
二叉树专题--P1030 [NOIP2001 普及组] 求先序排列
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度$ \le 8$)。222行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。111行,表示一棵二叉树的先序。样例输出 #1提示【题目来源】NOIP 2001 普及组第三题......原创 2022-06-29 01:28:37 · 138 阅读 · 0 评论 -
二叉树专题--洛谷 P3884 [JLOI2009]二叉树问题(dfs求二叉树深度 bfs求二叉树宽度 dijkstra求最短路)
如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:其中宽度表示二叉树上同一层最多的结点个数。给定一颗以 1 号结点为根的二叉树,请求出其深度、宽度和两个指定节点 x,yx, yx,y 之间的距离。第一行是一个整数,表示树的结点个数 nnn。接下来 n−1n - 1n−1 行,每行两个整数 u,vu, vu,v,表示树上存在一条连接 u,vu, vu,v 的边。最后一行有两个整数 x,yx, yx,y,表示求 x,yx, yx,y 之间的距离。输入三行,每行一个整数,依次表示二叉树的深度、宽度和 x,原创 2022-06-28 19:15:03 · 485 阅读 · 0 评论 -
dfs深度优先遍历 求树上各节点代表子树大小
输入格式第一行包含整数 n,表示树的结点数。接下来n-1行,每行包含两个整数α和b,表示点a和点b之间存在一条边。输出格式输出一个长度为n的sz序列,表示树上节点1~n所代表子树的大小。数据范围1≤n≤10^5输入样例91 21 71 42 82 54 33 94 6输出样例:9 3 2 4 1 1 1 1 1运用AcWing 846. 树的重心的思想,并稍作修改即可。#include<bits/stdc++.h>using namespace std原创 2022-03-23 11:27:16 · 1841 阅读 · 0 评论 -
AcWing第 41 场周赛 4310. 树的DFS(C题:dfs序典型例题)
dfs序 是很多树问题的基础时间复杂度:O(n)#include<bits/stdc++.h>using namespace std;const int N = 2e5+10;int n, m;vector<int> g[N];int q[N], p[N], top;int sz[N];void dfs(int u){ sz[u] = 1; q[top] = u, p[u] = top; top ++ ; fo...原创 2022-03-05 21:41:13 · 215 阅读 · 0 评论 -
AcWing 1118. 分成互质组
题意:给定 n 个正整数,将它们分组,使得每组中任意两个数互质。问:至少要分成多少个组?思路:dfs,对每一个元素,我们有两种操作:①:放到现有组中的最后一组中(依次枚举最后一组的所有元素,判断新加的元素是否与它们全部互质,如果是的则加入)②:新开一个组并放入用p[N]存放n个元素二维数组group[N][N]存放每个组我们从第一个组 g=1,组内没有数 gc=0,当前用掉了 cnt=0 个元素,当前组还未开始遍历数 start=0 的初始状态开始搜索。每次搜索的时候判断是否可以..原创 2022-03-04 21:46:21 · 524 阅读 · 0 评论 -
AcWing 1111. 字母(内部搜素dfs 回溯)
题目描述给定一个 R×S 的大写字母矩阵,你的起始位置位于左上角,你可以向上下左右四个方向进行移动,但是不能移出边界,或者移动到曾经经过的字母(左上角字母看作第一个经过的字母)。请问,你最多可以经过几个字母。样例输入样例:3 6HFDFFBAJHGDHDGAGEH输出样例:6思路:运用dfs,dfs过程中每个节点记录一下横、纵左边以及步数step,迭代出最大步数。算法(dfs)blablabla时间复杂度O(uncertain)O(uncertain)O(uncert..原创 2022-03-03 22:43:52 · 256 阅读 · 0 评论 -
AcWing 1026. 乘积最大(dfs迭代更新)
题目描述给定一个数字串,经过k次分割为k+1份,问各个部分累乘的最大值是多少?样例有一个数字串:312, 当 N=3,K=1 时会有以下两种分法:1)3*12=362)31*2=62这时,符合题目要求的结果是:31*2=62。思路:相当于在 上一题 基础上顺便迭代一个额外信息将数字串长度n分为k+1个数字相加,搜索出每一种情况,(可以参考: AcWing 4181. 数的划分,过程几乎一致的,但本题还有所削弱,上一题数据范围更大 )比如当n=4,k=2时可以搜索出这三种情况:4..原创 2022-03-03 21:10:10 · 548 阅读 · 0 评论 -
AcWing 4181. 数的划分(dfs组合类型枚举 + 可行性剪枝)
题目描述将整数 n 分成 k 份,且每份不能为空,即不能为0,问有多少种不同的分法。样例当 n=7,k=3 时,下面三种分法被认为是相同的:(1,1,5),(1,5,1),(5,1,1)。算法(dfs)搜索顺序:k个坑位,依次枚举每个坑位应该填啥,类似于排列数字,每枚举完一个坑位判断一下当前收集到的总和sum是多少,由于题设要求是组合类型枚举,因此可以人为规定一个递增的顺序,所以再设置一个变量last存储上一层选择的是什么数字,根据last和sum来缩小每次枚举的范围,即 [las..原创 2022-03-03 19:16:54 · 430 阅读 · 0 评论 -
AcWing 129. 火车进栈(dfs搜索 出栈顺序)
题意:若一个栈的输入序列为1、2、...、n ,求其可能的出栈顺序,并输出前20种方案。思路:我们可以将搜索中的每一个状态用三者来表示:state1(已经出栈的答案序列,用vector存),state2(还在栈中的序列,用一个stack存),state3(还未进栈的序列,直接用一个指向 即将入栈元素 的指针变量表示,因为未进栈的车是有序的)。我们实际操作只有两种:op1:车栈state2弹出栈顶元素并加入state1答案序列op2:将state3所指向的元素压入state2车栈..原创 2022-03-03 16:08:12 · 472 阅读 · 0 评论 -
AcWing 1117. 单词接龙(预处理节点关系dfs)
题意:如题。思路:1、通过贪心的思想,两个字符串拼接,重合部分越短,拼接后的长度越长,因此,需要预处理出所有单词两两拼接重合的最小长度,g[][]表示第i个字符串与第j个字符串拼接重合的最小长度2、从给定的字符开始,确定单词龙的第一个单词,向所有能够拼接到第一个单词后面的单词进行深度优先遍历3、dfs(drag,tail):drag表示当前的单词龙,tail表示当前字符串的单词尾巴,也就是上一个连接的单词简单来说:判断两个单词能否连接到一块(则连一条边),先预处理一个存储这样关系的二维邻接矩..原创 2022-03-03 12:07:02 · 185 阅读 · 0 评论 -
AcWing 1116. 马走日(dfs搜索顺序)
AcWing 1116. 马走日原创 2022-03-03 10:08:32 · 508 阅读 · 3 评论 -
AcWing 1113. 红与黑(dfs实现floodfill)
题意:有个铺满方形瓷砖的矩形房间,瓷砖只有红或黑两种颜色。某人在一块砖上,他可以移动到相邻的四块砖上。但他只能走黑砖,不能走红砖。统计一下总共可以到达多少块黑色的瓷砖。思路:用dfs实现floodfill算法对于这种问题,既可以用DFS,又可以用BFS。DFS代码比较短,但存在爆栈的风险,BFS代码较长,没有爆栈的风险且可以求得最小值深搜有两种模型第一种是棋盘内部从某个地方到另外一个地方(内部搜索,为了保证每个点只被搜索一次,不能回复现场,即不回溯),第二种是把棋盘当作一个整体(整个...原创 2022-03-03 09:31:27 · 224 阅读 · 0 评论 -
AcWing 1112. 迷宫(内部搜索无需回溯)
只对细节进行分析:为什么不需要恢复现场呢(st[x][y]=false)?“因为st[x][y]标记当前点(x,y)被搜索到,当你恢复现场的时候,假设你是从(px,py)搜到点(x,y)的时候,你在判断(x,y)可以被(px,py)到达之后已经将(x,y)计数一次,当你下次再从某个(px2,py2)搜到(x,y)的时候,此时要通过st[x][y]判重,如果你恢复现场,那么你将再从将(x,y)进行重复搜索,容易TLE,所以不要恢复现场”(与马走日进行对比)要注意把判断障碍物的if(g[x][y]=...原创 2022-03-02 13:31:17 · 432 阅读 · 0 评论 -
AcWing 843. n-皇后问题(两种搜索顺序比较)
思路1:本题有多种搜索顺序,这里给出两种搜索方式。第一种搜索顺序:思想与全排列思想一模一样,从前往后依次枚举每个皇后放置在哪一列(每一行只能放一个皇后且必须放一个皇后),相当于在全排列中设置n个位置,并依次枚举每个位置应该选什么数字。递归搜索树的绘制也可以参考上一题注意剪枝:放置皇后的同时判断该位置是否合法(有无冲突),如不合法,则没必要往下递归了,直接回溯其实我们也可以先完全像上题一样将n的全排列搜出来,再判断方案是否合法。不要row数组进行判重的原因:我们枚举的时候是按行枚举的,枚举...原创 2022-03-02 11:09:18 · 452 阅读 · 0 评论 -
AcWing 842. 排列数字(dfs分析本质)
[//]: # (打卡模板,上面预览按钮可以展示预览效果 ^^)如何用 dfs 解决全排列问题?dfs 最重要的是搜索顺序。用什么顺序遍历所有方案。对于全排列问题,以 n = 3 为例,可以这样进行搜索:DFS#include<iostream>#define cin std::ios::sync_with_stdio(false); cin.tie(0); cinusing namespace std;const int N = 8;int path[N]..原创 2022-03-02 10:17:50 · 524 阅读 · 0 评论 -
acwing165.小猫爬山(dfs剪枝 优化搜索顺序)
翰翰和达达饲养了 N 只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。翰翰和达达只好花钱让它们坐索道下山。索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过 W。每租用一辆缆车,翰翰和达达就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?输入格式第 1 行:包含两个用空格隔开的整数,N 和 W。第 2…N+1原创 2021-09-30 15:12:35 · 278 阅读 · 0 评论 -
hdu 1151 Air Raid(DAG有向无环图 最小路径覆盖+二分图最大匹配Hungarian)
Problem DescriptionConsider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an intersection and walking through town’s streets you can never reach the same intersection i原创 2021-10-11 21:51:16 · 375 阅读 · 0 评论 -
OpenJ_Bailian 4116 拯救计划(优先队列bfs)
Problem公主被恶人抓走,被关押在牢房的某个地方。牢房用N*M (N, M <= 200)的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。英勇的骑士(r)决定孤身一人去拯救公主(a)。我们假设拯救成功的表示是“骑士到达了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守卫,骑士一旦遇到守卫,必须杀死守卫才能继续前进。现假设骑士可以向上、下、左、右四个方向移动,每移动一个位置需要1个单位时间,杀死一个守卫需要花费额外的1个单位时间。同时假设骑士足够强壮,有能力杀原创 2022-01-11 13:09:15 · 325 阅读 · 0 评论 -
OpenJ_Bailian 4115 鸣人找佐助(二维bfs变种+特殊判重数组)
Problem佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸原创 2022-01-12 14:18:29 · 102 阅读 · 0 评论 -
POJ 3126 Prime Path(bfs最小步数模型+素数筛)
ProblemThe ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices.— It is a matter of security to change such things every now and then,原创 2022-01-13 18:13:33 · 149 阅读 · 0 评论 -
AcWing 166. 数独(dfs剪枝,二进制优化)
一、思路:每次挑选一个空白的格子,枚举这个位置应该填几(1~9,但可能不是所有数字都可以填,还需要满足某些性质)在当前空格中我们要在1~9之中选择一些符合要求的数字,依次枚举这个格子选择可选的数字,每枚举完一个数后递归到下一层 。假设我们已经把当前空白格填上了数字2,下一步递归时,和之前的步骤相类似,即随便选择一个还未填好的位置,用同样的方式枚举这个位置可以填写哪些数字。选定之后再递归地枚举下一个数,直到把所有的空白位置全部填满为止,就找到了一组合法的解。如果过程当中有一个格子什么数都填写不了原创 2022-01-14 17:48:13 · 419 阅读 · 0 评论 -
AcWing 845. 八数码(BFS最小步数模型,状态表示)
在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3x 4 6 4原创 2022-01-20 11:33:50 · 103 阅读 · 0 评论 -
POJ 1190 生日蛋糕(爆搜+四次剪枝优化)
Problem7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。令Q = Sπ请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。(除Q外,以上所有数据皆为原创 2022-01-21 17:48:03 · 818 阅读 · 0 评论 -
杂题选做 NC230337:Where is +(爆馊水题)
题目描述有一个正整数 n,现在需要把n拆分成两个整数 t1 和 t2。比如:20可以拆成2和0;321可以拆成32和1,也可以拆成3和21。请问:对于给定的n,t1+t2的最大值是多少?并输出该最大值。输入描述:输入一个正整数(n∈[10,10^9 ])输出描述:输出答案示例1输入48输出12说明48 可以拆成 4 和 8,所以答案等于 12。首先本题数据范围在1e9,我们根据题目意思枚举数位的话,完全可以裸的暴力枚举,让我们来折腾一下,用深搜来实现它。在这个题目中我训练到的原创 2022-01-23 19:09:07 · 501 阅读 · 0 评论 -
AcWing 4213. 最小结果(深搜)
有四个整数 a,b,c,d。有三个操作符 op1,op2,op3,每个操作符要么是 *(表示乘法),要么是 +(表示加法)。现在,我们要进行如下操作:从现有整数中选出两个,按 op1 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们还剩下三个整数。从现有整数中选出两个,按 op2 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们还剩下两个整数。从现有整数中选出两个,按 op3 进行运算,得到结果。将选出的两个整数舍弃,并将结果保留。此时我们只剩下一个整数。我们希望原创 2022-01-23 23:55:06 · 273 阅读 · 0 评论 -
AcWing 920. 最优乘车(建图,特殊处理输入,bfs求最短路)
题意:给定路线数m,站点数n,m条单程路线会经过哪些站点,问从起点1到终点n****最少要换乘几次。思路:换乘多少次 可以转换为 乘坐过多少次车减1步骤:1、在同一条路线中,任意一个 在此路线上的车站 均能 沿着该路线的方向 到达后面的车站,权值都是1,表示 只乘坐一次车。解释:以样例 4 7 3 6 为例,分别将 4 ~ 7、4 ~ 3、4 ~ 6、7 ~ 3、7 ~ 6、3 ~ 6 连一条边,权值为 1:表示从 车站4做到 车站7 只要乘一次车,表示从 车站4 做到 车站3 只..原创 2022-02-22 20:29:15 · 329 阅读 · 0 评论 -
AcWing 1135. 新年好(堆优化dijkstra打表 + dfs)
题意:规定起点为1号点,主角要求从起点出发,必须要经过其它5个点(这5个点的编号任意),且这 5个点的 经过顺序不唯一,问 主角总行程的最小值 是多少?图中的节点当然不仅仅只是上面所说的6个点,注意上的所有节点都是联通的,而且节点之间的边是无向边。思路:拿到一个题目并思考运用什么算法的时候,我们首先最要关心的是时间复杂度。我们先想想暴力怎么做,我们可以先爆搜枚举所有摆放的顺序,一共有5个需要经过的节点,因此就会有5!种拜访的顺序。(由于起点1号点是固定的,我们dfs爆搜顺序实际上是搜索2~...原创 2022-02-23 12:12:44 · 353 阅读 · 0 评论