- 博客(14)
- 收藏
- 关注
原创 BFS 广(宽)度优先搜索题目推荐以及题解(3)
本蒟蒻看了又看洛谷里dalao们的题解,又用并查集啊,深度优先搜索啊什么的,虽然本蒟蒻也讲过相关文章,但本蒟蒻仅仅是一知半解[忏悔][忏悔],还有dalao说该题用BFS很难写,但本蒟蒻认为,只要在输入的图中稍微做一些修改的话,BFS还是最简单,最粗暴,最好理解的,(抛开编码长不说)。不得不说洛谷的题还不错,嘻嘻嘻,简单的还是挺简单的,今天我们练速度,讲四道题,大家放轻松,不难,基本上看一遍题目就能知道思路,就可以直接上手啦,尊嘟尊嘟。接下来就很简单了,就是很简单的连通性问题,求有多少个连通块。
2024-07-30 20:25:24
1079
原创 BFS 广(宽)度优先搜索题目推荐以及题解(2)
和往常一样,用dx[],dy[]数组分别设定八个方向,再用STL里面的queue队列,从节点(x,y)中不断拓展,搜索。首先从第一步开始,步数为0,用queue队列不断拓展,那么新的节点的步数和原本节点的步数的关系就是+1,我们也可以看出它的权值,所以,得出结论:新节点的步数=原本节点的步数+1。蒟蒻登场,在上一篇文章当中,我们讲了洛谷里面的一些关于广度优先搜索的题目,但难度较低,虽然本篇中的题目难度也不会高到哪去,但至少相比于上篇是有所增加的,接下来讲的是两篇普及/提高-的广搜题目,废话不多说,上题。
2024-07-24 16:01:09
911
原创 BFS 广(宽)度优先搜索题目推荐以及题解(1)
其次,和平时的广度优先搜索的套路一样,先开一个char类型的mp[23][23]的数组,代表地图,其次用vis[23][23]表示该点是否搜索过,再定义dx[],dy[],表示上下左右的点,该题本蒟蒻用的是上右下左,在代码中也注释了,再用STL的queue的队列逐个搜索,直到得到答案。以上是洛谷中的两道关于BFS的题目,贪多嚼不烂,今天就先讲着两题,这两题比较适合练速度,加深理解的,初学者也可以先从这两题开始入手,一开始可能会写个把来小时,但这是正常现象,这种还是得多练的,但毕竟也不太难。
2024-07-23 20:22:59
677
原创 c++/c语言之用树状数组来进行(区间修改和询问)
我们以上图为例,tree[1]=C1=A1,tree[2]=C2=C1+A2,tree[3]=C3=A3,tree[4]=C4=C2+C3+A4,tree[5]=C5=A5,tree[6]=C5+A6,tree[7]=A7,tree[8]=C4+C6+C7+A8。其实这个名字看起来还挺高级的,但相信经过我的介绍,大家可以都听得明白,嗯呐,接下来,我们先详细而系统性地介绍一下树状数组的定义,概念,以及最为重要的编码和应用。然后去掉最后的一个1,得到000,就会惊奇的发现,没有了,那就直接return。
2024-06-01 09:45:47
983
原创 c++/c语言之前缀和与差分(区间修改和询问)
二维差分是指对于一个二维矩阵,通过差分的方法,得到一个新的二维矩阵。差分就是将相邻元素的差值保存下来,以此构建一个新的数组或矩阵。二维差分通常用于解决二维区间求和、修改等问题。具体来说,对于一个二维矩阵A,设B为其对应的差分矩阵,则B[i][j] = A[i][j] - A[i-1][j] - A[i][j-1] + A[i-1][j-1]。通过这个公式,我们可以快速计算出原矩阵中某个区间的和,也可以快速进行区间修改。
2024-05-25 14:20:34
728
原创 最短路径之BFS(宽度优先搜索)+优先队列(Dijkstra算法)c++/c语言
比如,在最开始时a入队,扩展邻节点b,e,d,距离分别为1,9,5,a出队。接着选择距离起点最短的b,再扩展新节点c,距离为5,b出队。接下来最短的是c,扩展新节点g,f,距离为15,11,再判断旧节点e,距离为12,大于e的距离,舍去,c出队。其实BFS(宽度优先搜索)+优先队列我们也可以将其看作是Dijkstra算法,但两者之间还是有些许的区别,当优先队列中的优先级是距离起点的最小值时,那么BFS(宽度优先搜索)+优先队列=Dijkstra算法,我们甚至可以延申出A*算法以及IDA*算法等。
2024-05-19 10:45:39
1231
1
原创 c++/c语言之深度优先搜索的原理以及具体代码实现
在本篇我们将会讲深度优先搜索,在前几篇文章中,我们讲了普通的BFS和双向广搜,感兴趣的家人们可以看回前几篇文章和。我们还是以前几篇文章的图为例:(此图来源于网络素材)箭头所指示的是BFS,但不影响,我们还能将BFS和DFS对比一下。BFS的遍历顺序:0,1,2,3,4,5,6;DFS的遍历顺序:0,1,3,4,2,5,6。对比分析可知,BFS是一层一层遍历的,而DFS则是一直走到底,如果没找到目标状态,就回溯到还没走的节点继续遍历。BFS用的是队列,直接用STL中的queue即可。
2024-05-12 10:03:55
1029
原创 c++/c语言爱心代码,表白必备 (娱乐)
我很喜欢张嘉佳的小说,他说:“一切坚强,都是柔软生的茧。你可以拒绝穿上盔甲,但无法阻止生长出茧。本宝宝相信你,在看的各位也在相信你,成功了记得留言报喜喔,嘻嘻嘻。在这大好年华的年纪,就大胆地去追求。将来,青春是用来回忆的。且趁年轻,就来点轰轰烈烈的。诗神苏轼说,且将新火试新茶,诗酒趁年华。鼓励那个特别的人告诉你喜欢你,因为未来的路上,你们将会一直拥有彼此。运行效果是一样的,只不过我用define修改了一下,比较c++的一个好处就是不分空格。失败了还有机会的,尊嘟尊嘟。去表白吧,祝天下有情人终成眷属。
2024-05-11 19:51:29
359
1
原创 广度优先搜索(BFS)进阶之双向广度优先搜索
比如下图中,在第三次循环时,我们分别将B,E,I这三个节点的子节点,也就是A,C,H,J,分别入队。适用场景:有确定的起点以及终点,并且能将从起点到终点的单向搜索,转换成分别从起点和终点出发的相遇问题,那么在这种情况下,如果单向的BFS会超时,那么可以优先考虑双向广搜,以此减少时间复杂度。,我们提到了广度优先搜索,即宽度优先搜索(BFS),具体的BFS的实现以及原理,大家可以看回上一篇文章。在上篇文章中我们也讲到BFS的实现,那么接下来我们对比一下BFS和双向广搜的代码,以及所搜索的节点的个数来比较。
2024-05-11 19:37:02
838
1
原创 树以及树的遍历:宽度优先搜索BFS c++的代码实现
【输出格式】 输出一行,包括若干个大写字母,描述小球到达空洞的完整移动步骤,其中'U'代表向上走,'D'代表向下走,'L'代表向左走,'R'代表向右走。针对刚刚的图是有的,我们好好观察一下就会发现按照BFS的访问顺序就是1,2,3,4,5,6。他的原理是,先将父节点入队,判断是否符合要求,如果符合就可以退出循环了,如果不符,就继续将父节点的两个儿子入队,直到找到符合要求的结果为止。第2到n+1行 ,每行m个字母,描述棋盘的具体信息,其中'.'代表空格⼦,'#'代表障碍,'O'代表空洞,'B'代表球。
2024-05-04 17:55:32
1215
原创 c++关于链表(续上篇)
其中private中的只有在class内可以修改的成员,在外界是无法直接访问的。这时候,就需要用到成员函数了,但成员函数一般只在class中声明而不定义,一般定义在class之外。删除就更简单了,直接跳过某个箱子,到达另一个。代码的实现在上一篇文章有,这里就不多说了。再上一篇文章中我们说链表就像是一排连在一起箱子(单链表),只不过前一个箱子与后一个箱子相连。本期就到这啦,下一期估计会讲矩阵和矩阵的快速幂,本宝宝这么辛苦,记得三连喔,嘻嘻嘻!插入,删除,以及查找,和输出。)中,我们讲了链表的初始化,
2024-04-26 19:06:12
266
3
原创 c/c++单链表的具体代码实现
按照我个人的理解,单链表就是一排连在一起箱子,不过只有前一个箱子可以与后一个箱子相连。话不多说,接下来单链表的初始化,插入,删除,查找,输出。家人们,以上代码先卖个关子,时间有点紧,下一期加强一下解释。
2024-04-21 18:23:03
257
2
原创 c/c++倍增法的原理,代码演示及运用
所以最后137可以表示为:2(2(2) + 2 + 2(0)) + 2(2 + 2(0)) + 2(0)。又比如:1315 最后可以表示为:2(2(2 + 2(0) +2)) + 2(2(2 + 2(0))) + 2(2(2) + 2(0)) + 2 + 2(0)可以表示成a(b)。进一步可表示为:7 =2^2+2+1= 2(2) + 2 + 2(0) 而 3 = 2 +1= 2 + 2(0)。【样例输出】2(2(2) + 2 + 2(0)) + 2(2 + 2(0)) + 2(0)
2024-04-21 14:24:18
622
1
原创 分解质因数 c++/c语言
它的时间复杂度为O(n^2),所以相对来说,递归的方法的速度会快一点,特别是大数。递归的方法整体比较简洁,代码量少,容易理解,时间复杂度为O(n);好了,今天的代码就分享到这里,希望对大家有帮助。,有错的话可以提出了。好,废话不多说,上代码。
2023-09-09 11:45:15
668
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人